函数递归

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中并不支持这种操作,所以当我们递归层级过大的话依然会造成栈溢出

posted @ 2019-07-25 18:11  Sean_Yang  阅读(204)  评论(0)    收藏  举报