本文章的代码如下链接:https://github.com/RunningIOS/HanoiDemo
工作中偶尔用到递归编程,最近抽空看看网上的文章,在解决汉诺塔问题上的解决问题思路很受启发。
经典的汉诺塔问题(这里不具体介绍规则了),面对看似相当复杂的问题,如果按照一般的思维去思考整过移动过程那个累呀,总觉得没底气实现呀。如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数
我们可以使用假设法进行分析问题:
要想A中的最大的圆盘移动到C中,那么A上面的圆盘全部都得移动到B中,然后再将A上面的圆盘全部移动到C中即可完成任务,那么如何将A上面的圆盘全部移动到C中呢,其实是可以重复了上面的移动方法,所以移动过程可以这样进行
1、将A上面的除最大的圆盘全部移动到B中
2、将A中最大的圆盘移动到C中
3、将B中的圆盘全部已到C中任务即可完成
为了完成3中的任务,又可以拆分任务
4、现将B中的除最大的圆盘全部移动到A
5、将B中最大的圆盘移动到C中
6、将A中的全部圆盘移动到C中即可完成任务
为了完成6中的任务,又可以拆分任务
.
.
.
面对一个很大的问题时,我们尝试分析出一些规律,尝试拆分成小问题,然后再把小问题继续拆分为更小的问题,循环往复地拆分下去,直到不能再拆分为止,对于这种问题就可以使用递归方法解决。