汉诺塔问题

汉诺塔(也称梵天塔)是印度的一个古老传说。据说开天辟地之神勃拉玛在一个庙里留下了三根金刚石柱,并在第一根上从上到下依次串着由小到大不同的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 2n1次。即当金盘为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(n1)+1
问题转化为子问题,得到递推关系式,初值为 T 1 = 1 T_1=1 T1=1, 很容易推出 T n = 2 n − 1 T_n=2^n-1 Tn=2n1

def f(n):
    if n==1:
        return 1
    else:
        return 2*f(n-1)+1
n=int(input())
print(f(n))
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cachel wood

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值