汉诺塔(也称梵天塔)是印度的一个古老传说。据说开天辟地之神勃拉玛在一个庙里留下了三根金刚石柱,并在第一根上从上到下依次串着由小到大不同的64片中空的圆型金盘,神要庙里的僧人把这64片金盘全部搬到第三根上,而且搬完后,第三根柱子上的金盘仍保持原来由小到大的顺序。同时要求每次只能搬一个,可利用中间的一根石柱作为中转,并且要求在搬运的过程中,不论在哪个石柱上,大的金盘都不能放在小的金盘上面。神说,当所有的金盘都从事先穿好的那根石柱上移到另外一根石柱上时,世界就将在一声霹雳中消灭了。
将三个金刚石柱编号为A、B、C,A为事先穿好金盘的石柱,B为目标柱,C为中转柱。
- 我们不妨先看看比较简单的情况
- 当金盘为1个时,只需要移动1次;
- 当金盘有2个时,则按A → \to →C,A → \to →B,C → \to →B的顺序移动金盘,需要移动3次;
- 当金盘有3个时,则按A → \to →B,A → \to →C,B → \to →C,A → \to →B,C → \to →A,C → \to →B,A → \to →B的顺序移动金盘,需要移动7次。
- 依次类推,当金盘为n片时,需要移动 2 n − 1 2^n-1 2n−1次。即当金盘为64片时,需要移动18446744073709551615次,假设移动一次需要1秒钟,一年31536926秒,则需要5800多亿年!
我们通过合情推理的方式得到了可能的结果,并没有严格的证明,下面用另一种思路来看看这个问题。
递归思路:我们把上面n-1个圆盘看做整体,从而把n个圆盘分成了两部分,使用倒推的方法。
• 用 T(n) 表示移动 n 个圆盘所需要的步数
• 根据算法
• 先把前面 n-1 个盘子转移到B上;
• 然后把第 n 个盘子转到C上;
• 最后再次将B上的 n-1 个盘子转移到C上
• 得到递推关系
T
(
n
)
=
2
T
(
n
−
1
)
+
1
T(n)=2 \;T(n-1)+1
T(n)=2T(n−1)+1
问题转化为子问题,得到递推关系式,初值为
T
1
=
1
T_1=1
T1=1, 很容易推出
T
n
=
2
n
−
1
T_n=2^n-1
Tn=2n−1。
def f(n):
if n==1:
return 1
else:
return 2*f(n-1)+1
n=int(input())
print(f(n))