汉诺塔问题描述:
如图,有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