递归算法的两个前提:
1 原问题可以层层分解为类似的子问题,且子问题比原问题的规模更小;
2 规模最小的子问题具有直接解;
递归进层(i→i+1层)系统需要做三件事:
1 保留本层参数与返回地址;
2 为被调用函数的局部变量分配存储区,给下层参数赋值;
3 将程序转换到被调用函数的入口;
而从被调用函数返回调用函数之前,递归退层(i←i+1层)系统也应完成三件工作:
1 保存被调函数的计算结果;
2 释放被调函数的数据区,恢复上层参数;
3 依照被调用函数保存的返回地址,将控制转换回调用函数。
当递归函数调用时,应按照“先调用后返回”的原则处理调用过程,因此上述函数之间的信息传递和控制转换必须通过栈来实现。系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,就为它在栈顶分配一个存储区,而当从一个函数退出时,就释放它的存储区,显然,当前正在运行的函数的数据区必在栈顶。
每层递归所需信息构成一个工作记录,包括所有的实在参数、所有的局部变量以及上一层的返回地址。每进一层递归,就产生一个新的工作记录压入栈顶。每退出一层递归,就从栈顶弹出一个工作记录。因此当前执行层的工作记录必为递归工作栈栈顶的工作记录,称这个记录为活动记录,并称指示活动记录的栈顶指针为当前环境指针。而这个递归工作栈是由系统来管理的,无须用户操心,所以用递归编制程序非常方便。
递归的消除:循环迭代代替或使用辅助栈来保存参数来模拟系统调用栈工作流程。
尾递归是指递归调用语句只有一个,而且是处于算法的最后,尾递归是单向递归的特例。阶乘的递归算法就是尾递归。
if(n==1) return 1;
return n*Fact(n-1);
所以尾递归可以转化为循环迭代。