编程思想之递归

本文章的代码如下链接:https://github.com/RunningIOS/HanoiDemo

工作中偶尔用到递归编程,最近抽空看看网上的文章,在解决汉诺塔问题上的解决问题思路很受启发。

经典的汉诺塔问题(这里不具体介绍规则了),面对看似相当复杂的问题,如果按照一般的思维去思考整过移动过程那个累呀,总觉得没底气实现呀。如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

编程思想之递归_第1张图片

我们可以使用假设法进行分析问题:

要想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中的任务,又可以拆分任务

.

.

.

面对一个很大的问题时,我们尝试分析出一些规律,尝试拆分成小问题,然后再把小问题继续拆分为更小的问题,循环往复地拆分下去,直到不能再拆分为止,对于这种问题就可以使用递归方法解决。

你可能感兴趣的:(编程思想之递归)