递归(Recursion),在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。
在使用递归时,需要注意以下几点:
- 递归就是在过程或函数里调用自身
- 必须有一个明确的递归结束条件,称为递归出口。
注意: 切勿忘记递归出口,避免函数无限调用。
实例
使用递归实现阶乘计算:
使用迭代实现
现在,使用迭代来实现。
使用迭代来实现汉诺塔游戏
汉诺塔主要是有三个塔座X,Y,Z,要求将从小到大编号为 1,2.....n 的圆盘从X移动到塔座Z上,要求
1、每次只能移动一个圆盘
2、圆盘可以插到X,Y,Z中任一塔座上
3、任何时候不能将一个较大的圆盘压在较小的圆盘之上
4、初始:所有圆盘都在 X 塔座,并且最大的圆盘在最底部,然后是次大的
5、结束:所有圆盘都在 Z 塔座,并且最大的圆盘在最底部,然后是次大的
递归算法:
n == 1时,把盘1从X移动到Z
当n > 1时
1、将n-1个圆盘(每次移动一个)从X移动到临时塔Y
2、将盘n从X移动到目的地Z
3、将n-1个圆盘(每次移动一个)从临时塔Y移动到目的塔Z
(实际理解为,每次移动盘子,都是将盘子从X移动到Z。所以将n-1个圆盘从X移动到临时塔Y,这一步操作中将Y理解为Z,即调用本身时传入的Y为Z,所以盘子是从X移动到Z;同理将n-1个盘子从临时塔Y移动到Z时,理解为Y为X,即调用本身是传入的Y为X,所以盘子还是从X移动到Z)
结果如下:
递归的优缺点:
优点:
- 递归使代码看起来更加整洁、优雅
- 可以用递归将复杂任务分解成更简单的子问题
- 使用递归比使用一些嵌套迭代更容易
缺点:
- 递归的逻辑很难调试、跟进
- 递归调用的代价高昂(效率低),因为占用了大量的内存和时间。