day16---递归函数

1. 递归

  • 功能解耦

  • 函数的作用:提高代码可读性,避免重复的代码,提高代码的复用性

  • 在函数中尽量使用return,少使用print

2. 递归函数

  • 递归函数的定义:在一个函数中调用自己

  • 默认的递归最大限度是:997或998(小于1000)

  • 修改默认最大限度:sys.setrecursionlimit,需要导入sys模块。尽量不要修改默认的最大限度

  • 往往递归和循环是在一起使用

  • 递归函数在算法中应用居多

    • 算法:一种计算的方法
    • 典型的排序:冒泡排序、快速排序、堆排序
    • 查找算法:二分查找算法
  • 人理解循环、神理解递归

# import sys
# sys.setrecursionlimit(10000)

3. 递归函数的应用

# x比y大2、y比z大2、z比i大2,i等于20,计算x的值
def func(n):
        if n == 4:
            return 20
        return func(n+1) + 2
print(func(1))
>>>
26
# 求8的阶乘算法
def func(n):
        if n == 1:
            return 1
        else:
            return n * func(n-1)
print(func(8))
>>>
40320
# 输出第20位斐波那契算法的数字
def func(n):
        if n == 1 or n == 2:
            return 1
        else:
            return func(n-1) + func(n-2)
print(func(20))
>>>
6765
# 三级菜单
menu = {
    '北京': {
        '海淀': {
            '五道口': {
                'soho': {},
                '网易': {},
                'google': {}
            },
            '中关村': {
                '爱奇艺': {},
                '汽车之家': {},
                'youku': {},
            },
            '上地': {
                '百度': {},
            },
        },
        '昌平': {
            '沙河': {
                '老男孩': {},
                '北航': {},
            },
            '天通苑': {},
            '回龙观': {},
        },
        '朝阳': {},
        '东城': {},
    },
    '上海': {
        '闵行': {
            "人民广场": {
                '炸鸡店': {}
            }
        },
        '闸北': {
            '火车战': {
                '携程': {}
            }
        },
        '浦东': {},
    },
    '山东': {},
}
def func(menu):
    while True:
        for i in menu:
            print(i)
        choose = input('请选择>>>:').strip()
        if choose == 'q' or choose == 'b':
            return choose
        if choose in menu:
            borq = func(menu[choose])
            if borq == 'q':
                return 'q'
func(menu)

4. 二分查找算法

# 查找列表中66的位置
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
def func(l, num, start = 0, end = None):
    if end == None:
        end = len(l) - 1
    if start <= end:
        mid = (end - start) // 2 + start
        if l[mid] > num:
            return func(l, num, start, mid-1)
        elif l[mid] < num:
            return func(l, num, mid+1, end)
        else:
            return ('%s的位置是: %s' %(num, mid))
    else:
        print('找不到这个值')
print(func(l, 66))
>>>
66的位置是: 17
posted @ 2017-11-08 21:52  _岩哥  阅读(115)  评论(0)    收藏  举报