我们调用该方法getFactorial(4);即求4!打印如下:
这段递归程序的边界条件就是n==0时,返回1,具体调用过程如下:
- 汉诺塔问题
汉诺塔问题其实是印度的一个古老的传说。印度教的主神梵天创造世界时,做了三根金刚石的柱子,并在其中的一根柱子上按照大小顺序依次放置了64个黄金圆盘。
梵天神告诉侍奉他的婆罗门(祭司),要借助一根柱子做中介,来把这64个圆盘一起移动到另一根柱子上;规则和上面说的一样,在三根柱子间一次只能移动一个圆盘,而且大圆盘不能放在小圆盘之上。
梵天大神说了,只要你们能实现最终的目标,世界就会在一个闪电中毁灭。
据说,这个婆罗门和他的后人从此就开始一刻不停的挪圆盘,以愚公移山的精神,为世界的最终毁灭贡献自己的力量。
让他们先挪一会!
解法概述
试想一下,如果只有两个盘子,盘子从小到大我们以数字命名(也可以想象为直径),两个盘子上面就是盘子1,下面是盘子2,那么我们只需要将盘子1先移动到B塔座上,然后将盘子2移动到C塔座,最后将盘子1移动到C塔座上。即完成2个盘子从A到C的移动。
如果有三个盘子,那么我们将盘子1放到C塔座,盘子2放到B塔座,在将C塔座的盘子1放到B塔座上,然后将A塔座的盘子3放到C塔座上,然后将B塔座的盘子1放到A塔座,将B塔座的盘子2放到C塔座,最后将A塔座的盘子1放到C塔座上。
如果有四个,五个,N个盘子,那么我们应该怎么去做?这时候递归的思想就很好解决这样的问题了,当只有两个盘子的时候,我们只需要将B塔座作为中介,将盘子1先放到中介塔座B上,然后将盘子2放到目标塔座C上,最后将中介塔座B上的盘子放到目标塔座C上即可。
所以无论有多少个盘子,我们都将其看做只有两个盘子。假设有 N 个盘子在塔座A上,我们将其看为两个盘子,其中(N-1)~1个盘子看成是一个盘子,最下面第N个盘子看成是一个盘子,那么解决办法为:
①、先将A塔座的第(N-1)~1个盘子看成是一个盘子,放到中介塔座B上,然后将第N个盘子放到目标塔座C上。完毕之后,A空。
②、然后A塔座为空,看成是中介塔座,B塔座这时候有N-1个盘子,将第(N-2)~1个盘子看成是一个盘子,放到中介塔座A上,然后将B塔座的第(N-1)号盘子放到目标塔座C上。
③、这时候A塔座上有(N-2)个盘子,B塔座为空,又将B塔座视为中介塔座,重复①,②步骤,直到所有盘子都放到目标塔座C上结束。
简单来说,跟把大象放进冰箱的步骤一样,递归算法为:
①、从初始塔座A上移动包含n-1个盘子到中介塔座B上。
②、将初始塔座A上剩余的一个盘子(最大的一个盘子)放到目标塔座C上。
③、将中介塔座B上n-1个盘子移动到目标塔座C上。
原理图示说明如下: