今天学习python的递归时遇到关于汉诺塔的问题,描述如下:
汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着n片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?
这里简单谈下这个问题。
我们通过递归来解决这个问题,可以假设三个柱子为A、B、C,起始A柱子上有n个圆盘,那么基本思路可以分为以下三步:
(1)将A柱上的n-1个圆盘移到B上(通过C盘);
(2)将A上剩余的那块最大的圆盘(第n块圆盘)移到C上;
(3)将B上的n-1块圆盘都移到C上(通过A盘)。
这样最终就实现了将A上的圆盘全部移到C上,对于递归来说我们不需要知道中间的具体过程就可以写出函数。
通过python我们可以这样写:
def move(n, a, b, c):
if n == 1:
print(a,'->',c)
else:
move(n - 1, a, c, b)
move(1, a, b, c)
move(n - 1, b, a, c)
move()函数接收4个参数,n表示移动圆盘的个数,a、b、c表示是从A盘通过B盘移动到C盘上。