关于递归理解与python实现

最近在看小甲鱼的视频学python,虽然小甲鱼时时有惊人之语,但讲的还不错,关于递归他讲了阶乘,斐波那契和汉诺塔三个例子,难度是递增的

递归我在学C语言的时候也了解过,但是还是有点懵懂,这几天学python函数学到递归,感觉有收获,于是写个博客记录一下

先说说递归:递归就是函数调用自身,有两个过程,一个是“递”,一个是“归”

首先是阶乘

阶乘的数学表达式是这样,比如n的阶乘  n!=n*(n-1)*(n-2)*....2*1

def factorial(n)
    '阶乘递归'
    if n == 1:
        return 1
    else:
        return n * factorial(n - 1)

阶乘递归可以这样理解

f(n)=1             (n=1)

f(n)=n*f(n-1)   (n>1)

然后是斐波那契数列

1,1,2,3,4,5....

斐波那契数列的特点是第一个和第二个数是1,后面的数都是其前面两个数的和

扫描二维码关注公众号,回复: 6238170 查看本文章
def fibonacci(m):
    '斐波那契递归'
    if m == 2 | m == 1:
        return 1
    else:
        return fibonacci(m - 1) + fibonacci(m - 2)

斐波那契数列也可以用数学函数帮助理解

f(n)=1                   n=1,2

f(n)=f(n-1)+f(n-2)  n>2

最后是汉诺塔

汉诺塔问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘

我们要实现的是将移动圆盘的顺序一个一个打印出来

def hanoi(n, x, y, z):
    '汉诺塔移动路径'
    if n == 1:
        print(x, "-->", z)
    else:
        hanoi(n - 1, x, z, y)  # 将上面n-1个盘子从x移动到y
        print(x, "-->", z)  # 将最下面的盘子从x移动到z上
        hanoi(n - 1, y, x, z)  # 将y上面的n-1个盘子移动到z

 n是圆盘数量,x,y,z分别代表三根圆柱

先整体分析hanoi(n,x,y,z)这个表示把第一根柱子,也就是第一根圆柱x上面的n个圆盘移动到 第三根z,如果函数是hanoi(n,1,2,3),就是把1上面的圆盘移动到3上面

hanoi()函数功能图示

def hanoi(n, x, y, z):
    '汉诺塔移动路径'
    if n == 1:
        print(x, "-->", z)
    else:
        hanoi(n - 1, x, z, y)  # 将上面n-1个盘子从x移动到y
        print(x, "-->", z)  # 将最下面的盘子从x移动到z上
        hanoi(n - 1, y, x, z)  # 将y上面的n-1个盘子移动到z

m = int(input())
hanoi(m, 'x', 'y', 'z')

输入3

x --> z
x --> y
z --> y
x --> z
y --> x
y --> z
x --> z


得到移动过程,没问题

局部分析:

    if n == 1:
        print(x, "-->", z)

这个就表示只有一个圆盘时,直接把x上面的圆盘移动到z上

hanoi(n - 1, x, z, y)  # 将上面n-1个盘子从x移动到y

这里就是关键了,先想想hanoi()函数作用,那这个函数就是把x的上面n-1个圆盘移动到y上,好了,前n-1个圆盘移动到y上

print(x, "-->", z)  # 将最下面的盘子从x移动到z上

这里表示的其实是将第一根圆柱最上面的圆盘移动到第三根圆柱,此时第一根圆柱只有一个圆盘,因为上面的n-1个已经在上一步移动到了第二根圆柱y

hanoi(n - 1, y, x, z)  # 将y上面的n-1个盘子移动到z

前面我们把n-1个圆盘移动到了y,然后把那最后一个圆盘移动到z,现在是最后一步,把y上面的n-1个圆盘移动到z

分析结束

就这么三步,解决汉诺塔

也许你还有疑问,既然可以移动n-1个圆盘,为什么不直接把n个圆盘移动到z上面,那你想想,hanoi(n,x,y,z)意思不就是把n个圆盘从x移动到z,有趣的递归

在未完成时,假设函数可以实现功能,先调用

递归就是调用自身

猜你喜欢

转载自www.cnblogs.com/Beibee/p/10863501.html