汉诺塔问题--递归解决

汉诺塔问题起源于一个类似传说故事,在Hanoi这个地方有一个寺庙,这里有3根柱子和64个大小不同的金碟子。每个碟子有一个孔可以穿过。所有的碟子都放在第一个柱子上,而且按照从上到下碟子的大小依次增大的顺序摆设。 移动的规则如下:

1. 每次只能从一个柱子的最上面移动一个碟子到另外一个柱子上。

2. 不能将大碟子放到小碟子的上面。

问题是,如何在这样的移动规则得到最少的移动步数。


虽然这个问题看起来是一个很复杂的问题,但是,抽象出来,并没有想象中的那么难。

首先,三个柱子分别记为a,b,c,我们已知的条件(或称为分析思路)是:

1.第一个目标肯定是把最大的那个碟子放在c柱子上;

2.最后一步肯定是把最小的那个碟子放在c柱子上;

3.最开始,a柱子放着所有碟子,最终肯定是c柱子放着所有碟子,那么,b柱子的使命就是起到一个中转站的作用;


现在有了已知条件,开始分析问题,抽象数据。现在假设有n个碟子,abc三个柱子,将要移动S(n)步(最终想要的结果)。第一个入手点,就是把最大的那个碟子放在C柱子上。首先将n-1个碟子从a移动到b柱子上,然后将最下面的碟子移动到柱子c,最后再将n-1个碟子移动到c。它是s(n)的子问题,s(n-1)。在中间的过程,只是中转站不同而已,有时候是b,有时候是a,除了借助的柱子和目的柱子不一样,其他的都是一样的。这样我们就可以


那么,s(n)与s(n-1)之间的关系又是怎么样的呢?首先需要将a->b,n-1个碟子,然后b->c,n-1个碟子,最后把碟子移动到c上。

s(n-1)是两次,最后移动一次,因此得到一个这样的推导关系: S(n) = 2S(n - 1) +1。

    再考虑一种初始的情况,假定只有一个碟子需要移动,我们直接将碟子从a移动到c,那么需要的步骤是1步。因此可以说S(1) = 1。

最后用递归的方式解决这个问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值