python递归函数
一、递归函数
递归的最大深度是1000层:为了节省内存空间,不要让用户无限使用内存空间
每次递归会新开辟一个临时名称空间随着函数的结束而清除,而递归函数是自己调用自己,就会不断的重复开辟新空间占用内存,而又不结束之前的空间。
count = 0
def func():
global count
count += 1
print(count)
func()
func()
-
递归要尽量控制次数,如果需要很多层递归才能解决问题,不适合用递归解决
-
循环和递归的关系
- 递归不是万能的
- 递归比起循环来说更占内存
-
修改递归的最大深度
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
二、递归函数练习
-
计算阶乘
def factorial(count): if count == 1: return count return factorial(count-1) * count
-
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)
-
计算斐波那契数列第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
-
三级菜单 可能是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)
本文来自博客园,作者:Mr-Yang`,转载请注明原文链接:https://www.cnblogs.com/XiaoYang-sir/p/14714877.html