函数递归

函数递归

函数的嵌套调用是:函数嵌套函数。函数的递归调用:它是一种特殊的嵌套调用,但是它在调用一个函数的过程中,又直接或间接地调用了它自身。

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

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

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

例如,已知一个人的年龄为16,后面每个人的年龄都是前一个人的年龄+2,求第n个人的年龄:

age = 16
def age_func(n):
    global age
    if n == 0:
        return age
    age += 2
    return age_func(n-1)  

print(age_func(5))  # 26

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

return age # age = 26
'''

经典函数递归问题---汉诺塔问题

汉诺塔问题不管在任何编程语言里都是经典问题,是采用递归算法的经典案例,该问题可以抽象如下:

一 、3根圆柱A,B,C,其中A上面串了n个圆盘

二 、这些圆盘从上到下是按从小到大顺序排列的,大的圆盘任何时刻不得位于小的圆盘上面

三 、每次移动一个圆盘,最终实现将所有圆盘移动到C上

利用Python语言接近自然语言的特性,开发者可以更容易的将递归算法翻译成程序语句,需要的代码量很小。汉诺塔问题的解决步骤用语言描述很简单,仅三步:

A,B,C三个圆柱,分别为初始位,过渡位,目标位,设A柱为初始位,C位为最终目标位

(1)将最上面的n-1个圆盘从初始位移动到过渡位

(2)将初始位的最底下的一个圆盘移动到目标位

(3)将过渡位的n-1个圆盘移动到目标位

对于递归算法中的嵌套函数f(n-1)来说,其初始位,过渡位,目标位发生了变化

def move(n, a, b, c):  # n为圆盘数,a代表初始位圆柱,b代表过渡位圆柱,c代表目标位圆柱
    if n == 1:
        print(a, '-->', c)
    else:
        move(n - 1, a, c, b)  # 将初始位的n-1个圆盘移动到过渡位,此时初始位为a,上一级函数的过渡位b即为本级的目标位,上级的目标位c为本级的过渡位
        print(a, '-->', c)
        move(n - 1, b, a, c)  # 将过渡位的n-1个圆盘移动到目标位,此时初始位为b,上一级函数的目标位c即为本级的目标位,上级的初始位a为本级的过渡位


move(2, 'A', 'B', 'C')
'''
A --> B
A --> C
B --> C
'''
原文地址:https://www.cnblogs.com/dadazunzhe/p/11352644.html