设汉诺塔盘子从上到下,依次为 d1, d2,d3,......dn, ( n>0)
记 上面前k个盘子整体为 S(k) (k>1)
递归的思路是,先假设前n-1个盘子为一个整体S(n-1),要把盘子从A移动C, 只需要借助桥梁B即可完成,具体移动方法是:
(1) S(n-1):A=>B
(2) dn:A=>C
(3) S(n-1):B=>C
实际上就是一个包含四个参数 f(n ,A, B, C) 的函数
第一步和第三步实际上就回到n-1层汉诺塔问题,
拿第一步来说,把前n-2个盘子看为一个整体S(n-2), 问题变为把盘子从A移动B,这时需要把C作为桥梁,移动方法是:
(4)S(n-2): A=>C
(5) d(n-1): A=>B
(6) S(n-2): C=>B
实际上和(1),(2),(3)的步骤没有区别,只是【桥梁】 B和C对调了一下而已:
通过(1),(2),(3)总结函数式:
(1) f(n-1, A, C, B) // 参数A为原地点,C为桥梁, B为目的地
(2) n : A=>C // 把最底下的盘子从 原地点=》目的地
(3) f(n-1, B, A, C) // 参数 B为原地点,A为桥梁,C为目的地
递归解这种问题是算比较好理解的, 更难的是用非递归的方法解,
实际上,所有递归算法都可以转换成非递归的算法,一些低级语言如汇编就没有递归算法。
递归,本质就是重复调用同一个方法,只是每次调用的时候传给方法的参数有变化而已。
然后我们看你这个例子:
move这个方法有三个参数,其中int类型的num参数表示碟子的个数。
然后再看方法的逻辑:如果碟子个数为1,那好说,直接从A柱移到C柱就行了。
如果碟子个数不为1,而是10(举个例子而已),那是不是只要把上面9个先移到B柱上,再把最后1个移到C柱上就行了?
那怎么样才能把那9个移到B上面呢?这不又是同一个问题么?把上面的8个移到C上面,在把第9个移到B上面不就好了么?你还会问这8个怎么移到C上么?
你看看3、4两步是不是重复做相同的事?这就是递归喽
可能有个盲点,那就是A、B、C之间移动是没有顺序的,也就是说不一定只能A—>B—>C,也可以A—>C—>B之类的。