Python汉诺塔递归算法

汉诺塔含义:

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

Python汉诺塔递归算法_第1张图片
Hanoi玩具

算法思路:
1.当只有一个圆盘时,只需要从A柱子挪到C柱子即可,1次解决。
2.当有n个圆盘时,且小圆盘只能放在大圆盘上,全部挪到C柱子上,一定是把C柱子先作为中转,n-1个圆盘全部挪到B柱子中,然后把A柱子中的最大圆盘挪到被清空的C柱子上,然后经历和B柱子同样的步数,把n-1个圆盘全部挪到C柱子上,按照大的在下小的在上的规则(此时把A柱子作为中转)

代码片段:

def move(n,a,b,c):
    if n == 1:
        print a,'-->',c
    else:
        move(n-1,a,c,b) #将n-1个圆盘最终挪到B柱子上
        move(1,a,b,c) #将A柱子上最大的圆盘挪到已被清空的C柱子上
        move(n-1,b,a,c) #将n-1个圆盘从B柱子上挪回C柱子上

move(3,'A','B','C')

运行结果:

Python汉诺塔递归算法_第2张图片
运行结果.png

三个圆盘恰好需要7次挪移。

扩展思考:

n个圆盘需要挪移的次数是(n-1)个圆盘挪移次数乘以2再加上1,即表示为:f(n)=f(n-1)*2+1,这是一个递推公式,可最终推导出通通项公式:f(n)=2^n-1

你可能感兴趣的:(Python汉诺塔递归算法)