Python:函数递归
定义:在调用一个函数的过程中直接或间接的调用该函数本身,称之为递归调用。递归调用最多能调用999层。
基础模型:
def func(): print('from func') func() #直接调用自身 func():
def func(): print('from func') bar() #间接调用自身 def bar(): print("from bar") func() func()
虽然以上两中方式为函数递归的基础模型,但往往不能直接这样使用。因为没有一个函数的结束条件,仅仅相当于一个死循环。
递归分为两个重要的阶段: 递推+回溯
递推:函数不断减少问题规模直至最终的终止条件。
回溯:拿到最终明确的值后,返回给上次调用进行处理,直至初始层。
练习题:解决年龄问题,求出alex的年龄
""" alex 他比佩奇 大两岁。 4 age(3) + 2 佩奇 他比日天 大两岁。 3 age(2) + 2 日天 他比太白 大两岁。 2 age(1) + 2 太白:我今年23. 1 23 """ def age(n): if n == 1: return 23 else: return age(n-1) + 2 print(age(4)) #这里的4表示解决问题的规模
29
流程分析:
""" def age(4): if n == 1: return 23 else: return age(3) + 2 23 + 2 + 2 + 2 def age(3): if n == 1: return 23 else: return age(2) + 2 23 + 2 + 2 def age(2): if n == 1: return 23 else: return age(1) + 2 23 + 2 def age(1): if n == 1: return 23 else: return age(0) + 2 """
注意在Python:
1、递归调用必须有一个明确的结束条件
2、在python中没有尾递归优化,递归调用的效率不高
3、进入下一次递归时,问题的规模必须降低
简单应用场景:
取出列表 l=[1,2,[3,[4,[5,[6,[7,[8,9,[10]]]]]]]] 中的所有元素
def get(l): for item in l: if isinstance(item, list): get(item) #如果元素为一个列表,那么递归调用自己把该列表传给get()函数,进行递归调用 else: print(item)
get(l)