怎样用比较简单易懂的理解汉诺塔问题的程序

怎样用比较简单易懂的理解汉诺塔问题的程序

每一步如图所示
对盘子而言,要是观察它的对称中心就会非常有规律,一定是当前盘子中的最后一个。
而对柱子而言,对称中心的那一行,一定是从已占有柱子移到“空闲”柱子。因为最后一个盘子是最大号,不能欺压别人。

■网友
搞清楚这个方法参数的意义有助于理解这个算法,
第一个参数:需要移动最上面盘子的个数
第二个参数:需移动盘所在的柱子
第三个参数:辅助用的柱子
第四个参数:目的地的柱子

■网友
典型的递归问题,一般数学归纳法可以解决,我简单描述一下吧:首先,假设T(n)是n个圆盘移动到另一个柱子所需步骤数;那么,上面的n-1个圆盘移动到二号柱所需步数是T(n-1);此时,最后一个圆盘移动到三号柱只需要一步吧;最后,把n-1个圆盘从二号柱移动到三号柱又需要T(n-1)步,总计2T(n-1)+1;所以,就有T(n)=2T(n-1)+1,很容易理解不是么。之后就是通过这个关系用数学计算T(n)公式了,并不复杂,在车上码子辛苦啊,就说这么多吧。热爱编程,热爱分享。
■网友
也许这样说你就明白了。其实,让我们手工去移我们肯定会做。我们做一下就明白,要将起始柱子上的盘子,借助临时柱子,移到目标柱子上,必须移去最大盘子上的所有盘子到临时柱子,然后将最大盘子移到目标柱子上。(此时,最大盘子所在的地方就可以视同平地。),这样,问题就变成了,将剩下那一轮盘子所在的柱子看作起始柱子,如何将剩下的那些盘子,借助新的临时柱子移到目标柱子上。是不是又回到老问题,只是问题小一号,起始柱子和临时柱子要重新定义。仅此而已。问题不断缩小,直到问题只剩一个盘子。问题还是如何将这个盘子从新的起始柱子借助临时柱子移到目标柱子上。
要不断缩小问题规模。直至变成已有解的最小问题。
下面才是我要说的重点。
【怎样用比较简单易懂的理解汉诺塔问题的程序】 手动理解问题大家都会,但是,编程时的表示会让人犯难。我学的时候想过下面的问题,也许对你有帮助。
除了最小问题,其余规模的问题其结构事一样的,所以,可以统一调用同一个函hanoid(问题规模也就是盘子数,起始柱子,临时柱子,目标柱子)hanoid(n,A,B,C) #表示将n个盘子,从A柱子借助B柱子,移动到C柱子.这里就体现了,函数调用时,参数的位置决定其意义。
试试理解下面这些语句(注意,不是每条语句在实际编程时都用到)
hanoid(n,B,A,C) #表示将n个盘子,从B借助A,移动到C.hanoid(n-1,B,C,A) #表示将n-1个盘子,从B借助C,移动到A.hanoid(n-1,C,A,B) #表示将n-1个盘子,从C借助A,移动到B.这里是我学这个时想通就彻底明白的地方。
另外,我们并没有移动任何东西,只是输出了一句打印语句。脑洞开一下,也许可以将打印语句变成操作机器手臂的语句,这样,真的就会有移动了。
就像大部分人建议的那样,理解递归与其追踪打印结果,不如画一下函数调用的堆栈图。

■网友
递归代码上很简洁;但是很耗内存


    推荐阅读