使用Python来解决卡诺塔即递归问题
当我们定义一个函数时,可以在函数中调用其他函数,而若当调用函数本身时,这时就被称之为迭代。
而迭代的典型应用之一就是汉诺塔问题。汉诺塔问题可以描述为,现在有三个柱子,分别为A、B、C,而在A上按照从上到下越来越大的顺序放着n个圆盘,现在需要将这些圆盘移动到C柱子上,要求在移动的过程中仍然遵守从上往下越来越大的顺序,即大盘子不能放在小盘子上请输出将盘子从A移动到C上的步骤。
显而易见,当n=1时,步骤如下:
A>>C
当n=2时,步骤如下:
A>>B
A>>C
B>>C
当n=3时,步骤如下:
A>>C
A>>B
C>>B
A>>C
B>>A
B>>C
A>>C
那么聪明的你,是否注意到,当n=1时,仅需1步,当n=2时,需要3步,当n=3时,需要7步,那么是否对于n个圆盘,需要的步骤为\[2^{n}-1\]
可以注意到的是,对于A(起始柱)上的n个卡诺塔,需要将前n-1个卡诺塔移动到B(中介柱)上,然后再把第n个卡诺塔移动到C(目标柱)上,最后再从B上(中介柱)把前n-1个卡诺塔移动到C(目标柱)上。如果设n个卡诺塔的步数为f(n),则\[f(n)=f(n-1)+1+f(n-1)=2*f(n-1)+1=2^{n}-1\]
那么,该模型可以抽象为:对于n个盘子的情况,先将A上的前n-1个盘子移动到B(也就是对应于当只有n-1个盘子的情况时,从A移动到B),再将第n个盘子从A移动到C,最后将B上的n-1个盘子移动到C(也就是对应于当只有n-1个盘子的情况时,从B移动到C),那么从此入手可以有
# -*- coding: utf-8 -*-
def move(n, a, b, c):
if n == 1 :
print( '%s>>%s'%( a , c ) );
else:
move(n-1 , a , c , b)
print( '%s>>%s'%( a , c ) );
move(n-1 , b , a , c)
当n =4 时,调用为
move( 4 , 'A' , 'B' , 'C' )
调用结果为
聪明的你,可否来验证一下,结果是否正确呢?
上一篇: 经典递归问题——汉诺塔
下一篇: 汉诺塔新解:一种更美的描述