分类:
直接递归
间接递归
如果递归函数中调用递归的语句为最后一个执行语句,则称这种递归为尾递归
递归使用条件
原问题可以划为一个或多个子问题,且子问题的求解方式与原问题相同,只是数量规模不同
递归的调用次数必须有限
必须有递归出口
递归的使用情况
定义是递归的
求n!
数据结构是递归的
单链表
求解方法是递归的
Hanoi问题
递归模型的组成
递归出口
递归体
栈和递归
函数调用栈
函数调用:包括一块代码到另一块代码之间的双向数据传递和执行控制转移
数据传递通过函数参数和返回值实现,另外调用函数时还要为其局部变量分配空间并在退出时回收
使用栈帧来支持函数调用
每次调用函数都会创建一帧,保存返回地址、函数实参和局部变量,并将该帧压入调用栈,成为栈顶,函数一旦执行完毕,对应的帧就出栈,对应的控制权就返回给上层的函数,并按照该帧保存的返回值地址确定程序中继续执行的位置
递归到非递归的转换
尾递归法可以通过循环或迭代的方式转换为等价的非递归算法
可以使用栈来模拟递归的执行过程从而实现转换
比较
优点:结构简单,易于阅读
缺点:占用内存多,执行效率低,不易优化