Loading

python递归函数

一、递归函数

递归的最大深度是1000层:为了节省内存空间,不要让用户无限使用内存空间

每次递归会新开辟一个临时名称空间随着函数的结束而清除,而递归函数是自己调用自己,就会不断的重复开辟新空间占用内存,而又不结束之前的空间。

count = 0
def func():
    global count
    count += 1
    print(count)
    func()
func()
  1. 递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决

  2. 循环和递归的关系

    • 递归不是万能的
    • 递归比起循环来说更占内存
  3. 修改递归的最大深度

    import sys
    sys.setrecursionlimit(100000)		# 修改递归深度,会根据电脑的性能来做适当的结束
    

一个递归函数要想结束,必须在函数内写一个return,并且return的条件必须是一个可达到的条件
并不是函数中有return,return的结果就一定能够在调用函数的外层接收到

函数的每层调用自己到为递,结束后的返回值为归

def func(count):
    count += 1
    print(count)
    if count == 5 : return 5		# 结束递归的条件
    ret = func(count)				
    print(count ,':',ret)
    return ret						# 在每次结束后把这次的返回值给上一层函数
print('-->',func(1))				
# 输出
2		# 第一层未结束在调用自身		-->递
3		# 第二层未结束在调用自身		-->递
4		# 第三层未结束在调用自身		-->递
5		# 第四层条件满足,并把 5 返回给第三层并结束第四层的函数						-->归
4 : 5	# 第三层,并把返回的值返回给上一层函数并结束第三层函数, 5 为第四层函数的返回值	-->归
3 : 5	# 第二层,把第三层返回的值在返回给第一层并结束                              -->归
2 : 5	# 第一层,获取第二层的返回值并返回给调用者								   -->归
--> 5

二、递归函数练习

  1. 计算阶乘

    def factorial(count):
        if count == 1:
            return count
        return factorial(count-1) * count
    
  2. os模块:查看一个文件夹下的所有文件,这个文件夹下面还有文件夹,不能用walk

    import os
    
    c = os.path.dirname(__file__)  # 当前文件父目录 练习
    def show_file(path):
        name_lst = os.listdir(path)
        for name in name_lst:
            abs_path = os.path.join(path, name)
            if os.path.isfile(abs_path):
                print(name)
            elif os.path.isdir(abs_path):
                show_file(abs_path)
    
    show_file(c)
    
  3. 计算斐波那契数列第10个数:1 1 2 3 5 8 13 21 34 55

    def bonacci_sequence(count):
        if count == 1 or count ==2:
            return 1
        else:
            return bonacci_sequence(count-1)+bonacci_sequence(count-2)
    
    print(bonacci_sequence(10))
    # 输出
    55
    
  4. 三级菜单 可能是n级

    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    def threeLM(dic):
        while True:
            for k in dic: print(k)
            key = input('input>>').strip()
            if key == 'b' or key == 'q':
                return key
            elif key in dic.keys() and dic[key]:
                ret = threeLM(dic[key])
                if ret == 'q': return 'q'
    
    threeLM(menu)
    
posted @ 2021-04-28 17:06  Mr-Yang`  阅读(253)  评论(0编辑  收藏  举报