def f1(): print('from f1') f1() f1() # 当超过递归最大深度时报错 "RecursionError"
def bar(): print('sa') foo() def foo(): print('sds') bar() foo() # 这样来回调用无心义, 当超过递归最大深度时报错 "RecursionError"
ps : 虽然能够修改, 但应该有边界, 不可能无限制的递归, 那样无心义, 递归应分为明确的两个阶段 (回溯, 递推)python
import sys print(sys.getrecursionlimit()) # 默认1000 sys.setrecursionlimit(2000) # 能够改 print(sys.getrecursionlimit()) # 2000
🍔回溯就是从外向里层一层一层递归调用下去 🍔回溯阶段必需要有一个明确的结束条件 🍔每次进入下一次递归时, 问题的规模应该减小,不然单纯的无限的递归毫无心义
🍔递推就是从里到外一层一层结束递归 🔰示例 age(5)=age(4)+2 age(4)=age(3)+2 age(3)=age(2)+2 age(2)=age(1)+2 age(1)=18 # 求 age(5) 的值 🔰先研究表达式如何成立 age(n) = age(n-1) + 2 age(1) = 18 🔰写函数计算 def age(n): if n == 1: return 18 return age(n-1)+2 # age(4)+2 = age(3)+2+2 = age(2)+2+2+2 = age(1)+2+2+2+2 = 18+8 = 26 print(age(5)) # 26
🔰什么是问题规模减小简单示例:算法
🍔将不是列表的值打印出来 l = [1, [2, [3, [4, [5, [6, [7, [8, [9]]]]]]]]] def outter(itmes): for line in itmes: if type(line) is not list: print(line) else: outter(line) outter(l) # 1,2,3,4,5,6,7,8,9
nums = [-23,-2,4,5,8,90,234,345,467,786,978,8900] # 从小到大排列 def check(num,l): if len(l) == 0: print("没有值") return if not num in l: print("此数字不存在") return mid_num = len(l) // 2 if num > l[mid_num]: # 说明在中间值得右边 l = l[mid_num+1:] # 使用切片将右边的值重新赋值给 l check(num,l) # 递归 elif num < l[mid_num]: # 说明在中间值得右边 l = l[:mid_num] # 使用切片将右边的值重新赋值给 l check(num,l) # 递归 else: print("OK!") check(8900,nums) # OK!