关于Hanoi双塔问题的个人理解(是最用心写的一个博客啦,希望能帮助到对汉诺塔问题还有疑问的同学哦!)

首先说一下汉诺塔游戏的规则:有三个柱子A,B,C,我们要做的是把A柱的所有圆盘,全部转移到C柱上,转移时遵循的规则如下:
1、每次只能移动一个圆盘
2、所有的大圆盘必须在小圆盘的下面
首先说明一下,假设盘子都在A上,将n个盘子分为最底层盘子,与其余盘子最底层盘子就是最下面的那个盘子,其余盘子就是除了最下面的盘子剩余的盘子,A为起始柱,B为非目标柱,C柱为目标柱。现在说这些定义有点抽象,不要着急哦,接下来会对这些进行详细讲解的。

当盘子数为1时的分析:

下图为盘子数量为n=1时最小移动次数。
关于Hanoi双塔问题的个人理解(是最用心写的一个博客啦,希望能帮助到对汉诺塔问题还有疑问的同学哦!)
因为n=1,即我们只需对最底层盘子移动到目标柱子即可,即最底层盘子移动次数为1。由于没有其余盘子,即其余盘子的移动次数为0。
所以,总移动次数为:0+1+0。

下面主要以n=2n=3为例,好好比较一下两者的相同之处哦

n=2时,盘子移动情况如下:

下图为盘子数量n=2时的最小移动次数。
关于Hanoi双塔问题的个人理解(是最用心写的一个博客啦,希望能帮助到对汉诺塔问题还有疑问的同学哦!)
这个图是存在两个盘子的情况,由于C是目标柱子,因此我们有如下的分配方案:
首先将1号盘从A->B,即移动1次(含义就是将其余盘子移动到非目标柱上)
然后将最低层盘子,即2号盘从A->C,即移动1次(含义是将最底层盘子移动到目标柱上)
然后将1号盘从B->C,即1号盘从B->C,即移动1次(含义是将在非目标柱的其余盘子移动到目标柱上,与最底层盘子形成一个整体)。
所以呢,当n=2时,需要移动的次数为1+1+1次。
我们用下图表示:
关于Hanoi双塔问题的个人理解(是最用心写的一个博客啦,希望能帮助到对汉诺塔问题还有疑问的同学哦!)
下面所有图都是以黑色箭头线表示最底层盘子的移动情况;蓝色箭头线表示其余盘子移动到非目标柱的移动情况;红色箭头线表示将非目标柱上的其余盘子移动到目标柱上。

下面说一下n=3时,盘子的移动情况:

首先将其余盘子移动到非目标柱上,具体如下图所示:
关于Hanoi双塔问题的个人理解(是最用心写的一个博客啦,希望能帮助到对汉诺塔问题还有疑问的同学哦!)
我们发现只需要3步,即n=2时,所有盘子从一个柱子移动到另一个柱子所用的步数。
然后我们将最底层柱子移动到目标柱上,如下图所示:
关于Hanoi双塔问题的个人理解(是最用心写的一个博客啦,希望能帮助到对汉诺塔问题还有疑问的同学哦!)
我们发现只需要移动一步即可。
然后我们将非目标柱上的其余盘子放到目标柱上,此时我们发现移动步数仍为3步,即n=2时,所有盘子从一个柱子移动到另一个柱子所用的步数。
具体移动情况如下图所示:
关于Hanoi双塔问题的个人理解(是最用心写的一个博客啦,希望能帮助到对汉诺塔问题还有疑问的同学哦!)
首先将3号盘从A->C,然后将2号盘从A->B,然后将1号盘从C->B,即移动3次含义就是将其余盘子移动到非目标柱上)
然后将最低层盘子,即1号盘从A->C,即移动1次含义是将最底层盘子移动到目标柱上)
然后将3号盘从B->A,将2号盘从B->C,最后将3号盘从A->C,即移动3次(含义是将在非目标柱的其余盘子移动到目标柱上,与最底层盘子形成一个整体)。
所以呢,当n=3时,需要移动的次数为3+1+3次。
通过分析盘子数量为2、3时的移动情况,我们就可以类比到n>3时盘子的移动情况啦,可以把盘子移动情况分为三个步骤(假设盘子数量为n)
step1:即将其余盘子移动到非目标柱上(step1所用步数就是盘子数为n-1的移动次数
step2:将最底层盘子移动到目标柱上(由于最底层盘子只有1个,所以移动步数为1即可)
step3:将其余盘子移动到目标柱上(step3所用步数就是盘子数为n-1的移动次数
也就是说step1与step3所用步数相等。其实也不难发现,若有3个柱子A、B、C,将n片盘子从盘子A移动到B上,与将n片盘子从盘子B移动到盘子C上所用步数肯定是一样的!
所以我们可以用下图进行表示其余盘子,最底层盘子,移动的情况:
关于Hanoi双塔问题的个人理解(是最用心写的一个博客啦,希望能帮助到对汉诺塔问题还有疑问的同学哦!)
蓝色箭头线表示step1的移动情况;黑色箭头线表示step2的移动情况;红色箭头线表示step3的移动情况。
所以通过以上的分析,我们就知道有如下的公式啦:
令f(n)表示盘子有n个时,从起始柱移动到目标柱的最小步数。
即有f(n)=f(n-1)+1+f(n-1)
f(n)=2*f(n-1)+1
下面我们以盘子数量为N=4为例,求解从起始柱移动到目标柱所用的最少步数:
我们知道当n=N-1=3时,即3个盘子从一个柱子移动到另一个柱子所需要3+1+3=7步。
因此我们先将从上往下数的3个盘子从A->B(花费7步),然后将最底层盘子从A->C(花费1步),然后将B柱上的3个盘子从B->C(花费7步)。
所以一共呢,就需要7+1+7=15步啦。