定义: 在调用一个函数的过程中直接或间接的调用该函数本身, 称之为递归调用. 递归调用最多能调用 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)
来源: http://www.bubuko.com/infodetail-2638515.html