python代码实现汉诺塔问题

汉诺塔问题描述:

如图,有A ,B , C三个柱子,A上有n个盘子,每次只能从A上移动一个盘子,且必须保证大盘子在小盘子下面。问如何将A上的盘子移动到C盘??

思考:编写move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法,代码如下:

def move(n,a,b,c):    if n == 1:        print(a, '-->', c)
    else:
        move(n-1,a,c,b)#a柱最上方的n-1个盘子落在b柱
        move(1,a,b,c)#a柱的最小面盘子落在c柱
        move(n-1,b,a,c)#b柱上的n-1个盘子,落在c柱
#当A有3个盘子的时候move(3,'A','B','C')运行结果如下:A --> C 
A --> B 
C --> B 
A --> C 
B --> A 
B --> C 
A --> C 

复杂度分析:

如上所示:A 柱子有3个盘的时候,移动到B柱子,需要 7次。现在思考A柱子有4个盘的时候,移动多少次?
        (1)当A柱子有4个盘子时,同理,最上面3个盘子移动了7次到达B柱子(注意:这里是移动到B柱子)
        (2)将 A柱子的最下面 第4个盘子,移动1次到达 C柱子;
        (3) B柱子上的3个盘子, 同理,移动7次到达 C柱子(任务结束)
A柱子有4个盘的时候,移动次数=“3个圆盘重新摞在一起的次数”+1次+“3个圆盘重新摞在一起需要的次数”
n=3时,次数为2的3次方-1        n=4时,移动次数为:2的4次方-1
得出结论:A有n个盘的时候,移动次数为: 2的n次方-1


猜你喜欢

转载自blog.csdn.net/qq_28632639/article/details/79659148