64汉诺塔问题


将所有盘子从木桩1移到木桩3,移动规则如下:

1、每次只能移动一个盘子,而且只能从最上面的盘子搬动。

2、任何盘子可以搬到任何一根木桩。

3、必须维持盘子的大小是由上而下依次递增。

解决思路: 数学归纳法,即盘子n=1,n=2,n=3情况下的盘运过程。

从中你可以总结出一个数学公式或通用搬运过程。

使用数学公式,你会直接得出次数。这和老老实实去搬相比得出搬运次数。是一个捷径。最后结果是殊路同归,但缺少愚公移山的过程。

所以,通用搬运过程,可以展示具体的搬运过程,可以从过程得出结果。这就是算法,也就是计算机科学与数学的区别。

通用搬运过程:

Step1.将上面n-1个盘子从木桩1搬移到木桩2.
Step2.将盘子从木桩1搬移到木桩3.
Step3将木桩2的n-1个盘子搬移到木桩3.  



是不是有点如何把大象塞进冰箱的味道呢?


代码是不是有点迷惑呢?

第15行是第一步骤,也就是将上面n-1个盘子从木桩1搬移到木桩2.

hanoi(dishs - 1,peg1,peg3,peg2);/* 第一步骤 */

第17行是第三步骤,也就是将木桩2的n-1个盘子搬移到木桩3.

hanoi(dishs - 1,peg2,peg1,peg3);/* 第三步骤 */

这样不去理解代码,而去记住代码,是不是方便些?


如果汉诺塔的问题变异了:  


如果再变异成有n个盘子和n根柱子,求出最少移动次数,最多移动次数,指定移动次数的移动过程。你能写吗?

能。从汉诺塔的本质出发。汉诺塔的本质就是一个过程:首先算固定盘子和固定柱子的移动次数,从中推导出n个盘子和固定柱子的移动次数,从中推导出n个柱子和固定盘子的移动次数。继而推导出n个盘子和n跟柱子的移动次数。至于指定移动次数的移动过程,就有点九阴真经的味道了。

我们可以看到,汉诺塔的本质有点宏观上的数学归纳法。


以上纯属我扯淡,大家娱乐下就行。  


合乎自然而生生不息。。。
原文地址:https://www.cnblogs.com/samwu/p/2268381.html