用递归算法解决汉诺塔问题

一、汉诺塔问题

在计算机的算法中,汉诺塔问题被列为经典的递归算法问题。问题的描述是:

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

二、问题分析


首先根据题目的意思,将汉诺塔定义为一个递归的问题,分别有X,Y,Z三根柱子,如果是只有一个圆盘,则直接从X=>Z,搬动一次即可;

如果是两个圆盘:则先从X=>Y,搬动最上面的到Y,然后X=>Z,把最大的盘子搬动Z,再将Y上的最小的盘搬到Z,即Y=>Z共三次搬动即可。

如果是三、四、五等等,n块的圆盘,可以把上面的圆盘都看作一个整体,逐一减少,变成了一个圆盘的问题。


三、算法实现

def hanoi(n, x, y, z):
   global counter
   if n == 1:    #递归结束的条件
       print(x + "=>" + z)
       counter += 1
   else:
        hanoi(n-1, x, z, y)   #注意参数的循序,当n-1时,x=>y
        print(x + "=>" +z)    #x=>z
        hanoi(n-1, y, x, z)   #当n-1时,y=>z
        counter += 1

if __name__ == '__main__':

    counter = 0
    num = input("input the number of disks:")
    hanoi(num, 'X', 'Y', 'Z')
    print("The counter number is:", counter)


四、运行结果

input the number of disks:3

X=>Z

X=>Y

Z=>Y

X=>Z

Y=>X

Y=>Z

X=>Z

('The counter number is:', 7)

举报
评论 0