递归的两种模式
模式一
//递归的过程中在"递"的过程中解决问题
function function_name(Max_argument){
if(end_condition){
end;
}else{
solve;
function_name(Min_argument);//问题规模逐渐减小
}
}
注:位于递归函数前的语句和函数具有顺序性
模式二
//递归的过程中在"归"的过程中解决问题
function function_name(Max_argument){
if(end_condition){
end;
}else{
function_name(Min_argument);//问题规模逐渐减小
solve;
}
}
注:位于递归函数后的语句的执行顺序与原顺序相反;
每一级的递归调用都拥有自己当前的局部变量,所以当调用对象的时候应该注意是调用对象的非引用(复制对象), 以避免修改子对象造成对主问题的影响
调用栈
调用栈:描述函数之间的调用关系,当函数之间相互调用的时候会使用调用栈;
调用栈由多个栈帧组成,每个栈帧记录着一个未运行完的函数; 栈帧中保存着该函数的返回地址以及局部变量;
在递归中,递归函数的每一次的”递进去”,栈帧都会将上个函数的返回地址局部变量保存以便在返回的过程中找得到相应的”回归出来的方向”
通过一个简单的例子说明上述调用顺序问题
//10进制转2进制
void f(int n){
if(n==0)
return;
printf("%d",n%2);//模