函数递归
1、什么是函数递归
函数递归:函数的递归调用。即在函数调用的过程当中,直接的或者间接的调用的函数本身
那说起递归你们肯定之前都听过这样一个故事:从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚,老和尚给小和尚讲故事,从前有座山。。。。
那我们一起想一想,我们调用函数的时候是不是会根据函数名找到函数对应的内存地址,然后加括号就可以调用
def foo():
print("from foo")
foo()
foo()
2、为什么要用递归?
把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。
3、怎么使用递归
直接使用:
def foo():
print("from foo")
foo()
foo()
RecursionError: maximum recursion depth exceeded in comparison
调用Python对象时超过最大递归深度
函数执行一次,就会创建一个临时空间,而且在函数执行结束之前不会关闭,这个递归就会让函数一直执行下去,最终就会触发Python的这样一个机制,报错。
那现在我们一起来看一下他到底能递归多少层
import sys
# 查看递归深度
print(sys.getrecursionlimit())
# 设置递归深度
print(sys.setrecursionlimit(10000))
执行完我们是不是发现递归就跟死循环一样,

间接使用:
def func1():
print("from func1")
func2()
def func2():
print("from func2")
func1()
func1()
现在有这样一个例子


def foo(num):
print("抱着")
if num > 0:
foo(num - 1)
else:
print("我的小鲤鱼")
print("的我")
print("吓得我抱起了")
foo(3)
4、回溯、递推
回溯:回溯阶段一定要有一个明确的结束条件,不然就会一直往下走,当遇到终止条件后,则会从最后一级一级的把值返回来
递推:递推在一层层从里层往外层结束递归,每一次都是基于上一次进行下一次的执行。
5、总结
1、递归一定要有一个明确的结束条件
2、每进入下一次递归,问题的规模都应该减少
3、在python中没有尾递归优化
4、递归效率不高,递归层次过多会变成死循环,导致栈溢出
6、尾递归优化
def func(n):
return func_iter(n, 1)
def func_iter(num, result):
if num == 1:
return result
return func_iter(num - 1, num * result)
# print(func(5))
# print(func(1000))
尾调用由于是函数的最后一步操作,所以不需要保留外层函数的调用记录,因为调用位置、内部变量等信息都不会再用到了,所以尾递归优化可以有效的防止栈溢出,但是尾递归优化需要编译器或者解释器的支持,在Python中并不支持这种操作,所以当我们递归层级过大的话依然会造成栈溢出
作者信息
Sean
Stay hungry,Stay foolish.

浙公网安备 33010602011771号