递归

递归

一、什么是递归

函数的嵌套调用是:函数嵌套函数。函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接地调用了它自身,并且要又退出函数的条件(递归: 函数A调用函数A)。

def foo():
    print('from foo')
    foo()

foo()  # 进入死循环

如果递归函数不断地调用函数自身,那么这个递归函数将会进入一个死循环,因此我们应该给递归函数一个明确的结束条件。

递归必须要有两个明确的阶段:

  1. 递推:一层一层递归调用下去,进入下一层递归的问题规模都将会减小
  2. 回溯:递归必须要有一个明确的结束条件,在满足该条件开始一层一层回溯。

递归的精髓在于通过不断地重复逼近一个最终的结果。

53递归-代码.gif

二、递归使用

求解年龄

6/18/20/22/24

后面一个人的年龄比前一个年龄多两岁,求第n个人的年龄

# 递归的核心:递进的时候能够达到一个结果,问题规模越来越小(不一定要真正的达到)并且要设置一个条件,能够让最后一次函数调用结束

'''
age_func(5) --> return age_func(4)+2 == 24+2 =26
age_func(4) --> return age_func(3)+2 == 22+2 = 24
age_func(3) --> return age_func(2)+2 == 20+2 = 22
age_func(2) --> return age_func(1)+2 == 18+2 = 20
age_func(1) --> return age_func(0)+2  == 16+2= 18
'''

age = 16


def age_func(n):
    global age
    if n == 0:
        return age

    return age_func(n - 1) + 2


res = age_func(6)
print(res)

三、总结

python中的递归
python中的递归效率低,需要在进入下一次递归时保留当前的状态,在其他语言中可以有解决方法:尾递归优化,即在函数的最后一步(而非最后一行)调用自己,尾递归优化但是python又没有尾递归,且对递归层级做了限制

总结递归的使用:

  1. 必须有一个明确的结束条件

  2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

  3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

posted @ 2019-08-14 16:23  RandySun  阅读(150)  评论(0编辑  收藏  举报