5.3 Python代码与函数复用:用递归函数求解汉诺塔问题

汉诺塔源于印度古老传说。其中规则如下:已知有三根柱子,其中一根柱子从上到下依次排列着N个圆盘,然后把该柱子上的圆盘,从下面开始按大小顺序重新摆放在另一根柱子上。同时,小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

5-3-1

运用递归的思想去解决问题,首先我们先定义四个函数变量:圆盘数量N、起始柱、目标柱、中间柱。

第一步:当N=1时,需要一步,从起始柱到目标柱,即从A->C。

第二步:当N大于1时,首先将A上的N-1个圆盘移动到B上,把A上最后一个圆盘移动到C上,此时A是起始柱、B是目标柱、C是中间柱。

计数+1

第三步:将B上的N-1个圆盘移动到C上,递归关系建立完成,此时B是起始柱 、C是目标柱、A是中间柱。

2021年5月16日,中国龙岩的陈诺以29.328秒的成绩打破了6层汉诺塔吉尼斯世界纪录。

下面是在Python中建立递归函数求解6层汉诺塔问题,得出圆盘移动过程及移动的次数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
count = 0

def hanoi(n, src, dst, mid):

    global count

   if n == 1:

       print("{}:{}->{}".format(1, src, dst))

       count += 1

   else:

       hanoi(n-1, src, mid, dst)

       print("{}:{}->{}".format(n, src, dst))

       count += 1

       hanoi(n-1, mid, dst, src)

hanoi(6,'A','C','B')

print(count)
-> -> -> -> -> -> ->
1:A->B 2:A->C 1:B->C 3:A->B 1:C->A 2:C->B 1:A->B
4:A->C 1:B->C 2:B->A 1:C->A 3:B->C 1:A->B 2:A->C
1:B->C 5:A->B 1:C->A 2:C->B 1:A->B 3:C->A 1:B->C
2:B->A 1:C->A 4:C->B 1:A->B 2:A->C 1:B->C 3:A->B
1:C->A 2:C->B 1:A->B 6:A->C 1:B->C 2:B->A 1:C->A
3:B->C 1:A->B 2:A->C 1:B->C 4:B->A 1:C->A 2:C->B
1:A->B 3:C->A 1:B->C 2:B->A 1:C->A 5:B->C 1:A->B
2:A->C 1:B->C 3:A->B 1:C->A 2:C->B 1:A->B 4:A->C
1:B->C 2:B->A 1:C->A 3:B->C 1:A->B 2:A->C 1:B->C

63

一共需要移动63次。

Licensed under CC BY-NC-SA 4.0
© ziyue.tech版权所有
Built with Hugo
主题 OoO落墨灼夭 设计

本站访问量:   您是本站第 位访问者