首先解释递归思想:递归就是将一个大问题分解成若干个性质相同的小问题(这里可能说的比较抽象,所以本篇的三个问题就是用来为这个举例的)
1.汉罗塔问题
先从该程序的hanluota函数看起,if语句部分留在后面讲解,else语句部分是递归算法,先讲解这个
else部分:我们使用 hanluota这个函数 解决汉罗塔问题,于是便 假设他有 将n个盘子 从 起始柱 借助 中间柱 移动到 目的柱(且符合要求)的能力(即使现在没有实现,可以假设他有这个能力,因为我们完善后的函数一定要具有这种能力,现在直接认为他有这种能力的话,有利于后面递归的思考) ,所以 else语句的含义是 第一句:先 将n-1个盘子 从A柱 借助 C柱 移动到 B柱,也就是说认为此时 A柱上只剩下一个最大的盘子,其他n-1个盘子按照顺序摆放在B柱上,所以此时第二句只需将A柱的盘子移动到C柱(程序中是为了形式统一才这样写,可以换一种写法),第三句的意思是将B柱上存放的n-1个盘子 经由 A柱 移动到C柱,这样全部的n个盘子全都放在了C柱上
if部分:经过上面的讲解,大概知道之后遇到递归该怎么思考了,但是递归外的部分(如本例的if语句里的内容)该怎么写呢?个人理解是:在递归的过程中 hanluota函数的第四个参数(代表盘子的参数)会越来越小,我们要找到一个“基础单元”,也就是说这个问题中所有的动作都可以用这个代替(或者说都要进行这个动作),显然一次只移动一个盘子是最合适的(即if中n=1的时候)
补充一下本例if语句用n=2也是可行的,不过也要写明n=1的情况,比较繁琐(因为一次移动两个盘子是一次移动三个盘子的子动作,可以将n=3带入hanluota函数中,自然能理解这句话)(所以移动一个盘子也是移动两个盘子的子动作)(本例n和n-1相隔1,就是说一次递归,移动的盘子数只会减1,就是说要会移动三个盘子,只需要使用 移动两个盘子的方法,以此类推,所以说n>=2时,只需要n==2的代码便可,n==1是为了防止A柱上原本只有一个盘子的情况)
2.青蛙跳台
这个其实和汉罗塔是一个道理,我们快速过
else部分:假设青蛙只跳一节台阶,那么还剩n-1节台阶,如果青蛙跳两节台阶,那么还剩n-2节台阶,这两种情况加起来就是全部情况这种情况
if部分:既有n==1的,又有n==2的,是为了防止例如n等于3带入,就要进行1和2的递归,这两个合起来才是“基础单元”(汉罗塔问题里面 递归 跨度 是1,和本例不同,所以举例子说明)
3.快速排序
讲解下快速排序原理:任选一个数作为基准数,然后以这个数为基准,使其左边的数都小于他,右边的数都大于他,那么这个数的位置就是正确的,然后进行递归,直到将所有数都排到对应的位置,如果理解递归,理解起这个也是容易的(修改:break后面的第三行注释,应该是 认为 比x(也就是基准数)小的数 一定排在 比x大的数 的左边)
这个不同的是这里面有个while(1)循环,这个是 每确定一个数的准确位置 都要进行的重复操作,不像之前的那样 每一步都可以用“基础单元”代替