C语言递归函数问题,大小虾都请进!!
请问递归的返回过程是怎样的,为什么只有一个return(c),而却有多次的返回值,我苦想了三天都想不出,有劳大家解答,先谢谢了
#include<stdio.h>
void main()
{int age(int n);
printf("%d\n",age(5);
}
int age(int n)
{int c;
if(n==1)
c=10;
else
c=age(n-1)+2;
return(c);
}
[解决办法]
哦,三言两语好像我也说不明白。
你最好找找关于程序执行栈的资料看看,也许很快理解了。
[解决办法]
。。。如果你看书没看明白的话,估计我讲了你也听不懂
[解决办法]
调用几次return几次。
[解决办法]
5 4 3 2 1
[解决办法]
怎么说呢,你可以认为,递归就是函数调用。
返回多次是因为被调用多次。
请问递归的返回过程是怎样的,为什么只有一个return(c),而却有多次的返回值,我苦想了三天都想不出,有劳大家解答,先谢谢了
#include <stdio.h>
void main()
{int age(int n);
printf("%d\n",age(5);
}
int age(int n)
{int c;
if(n==1)
c=10;
else
c=age(n-1)+2; //只要不满足终止条件,age(n-1)被调用,在age(n-1)里,如果n-1又运行到else,age又会被调用
return(c);
}
[解决办法]
运行结果是18.
首先以5调用age
age判断不是1执行age(5-1)+2,在这里需调用程序自己,所以指令进栈,开始调用age(4)
age判断不是1执行age(4-1)+2,在这里需调用程序自己,所以指令进栈,开始调用age(3)
age判断不是1执行age(3-1)+2,在这里需调用程序自己,所以指令进栈,开始调用age(2)
age判断不是1执行age(2-1)+2,在这里需调用程序自己,所以指令进栈,开始调用age(1)
age判断是1执行c=10及return(c),返回10,上步出栈c=10+2=12,return(c),返回12
再上一步出栈c=12+2=14,return(c),返回14
再上一步出栈c=14+2=16,return(c),返回16
再上一步出栈(即第一次入栈的指令)c=16+2=18,return(c),返回18.
子程序结束返回调用程序printf("%d\n",age(5); )输出18
[解决办法]
调用几次 return几次
你应该去知道一点汇编知识,一般的函数调用就是
call <函数地址>
...
ret
每次调用的代码段不变,它无非就是call了n次的同一个地址,同时执行ret返回了n次
[解决办法]
一楼、二楼最鄙视你们这种人,想讲就讲一讲,不想讲就顶一下,占着茅坑不拉屎!!!
[解决办法]
#include <stdio.h> void main() { int age(int n); printf("%d\n",age(5)); } int age(int n) { int c; if(n==1) c=10; else c=age(n-1)+2; return(c); }
[解决办法]
按照10楼的图 代码执行到哪一步后暂停,接着调用函数,直到最后一次满足判断条件,不再调用函数。第一次return的结果就是最后一次调用函数的结果。依此类推。
[解决办法]
樓主可以把递归看成是一个盒子套着一个盒子,在最里面有一块小月饼。
如果你想知道月饼是什么馅的,那你就得一层层的剥开,尝一小口,哦,是“糖醋鲤鱼”馅的,然后再偷偷的放回去,一层一层的包上。
[解决办法]
我是我是把结构体搞得清清楚之后一下就明白递归了。谢谢!
------解决方案--------------------
#include <stdio.h> void main() { int age(int n); printf("%d\n",age(5)); } int age(int n) { int c; if(n == 1) c=10; else c=age(n-1)+2; return c ; }//当n=5时,调用age(5),执行else部分c=age(5-1)+2=age(4)+2;此时并不往下执行,因为表达式中有age(4)的值还未求出,于是需要计算age(4);//当n=4时,调用age(4),执行else部分c=age(4-1)+2=age(3)+2;此时并不往下执行,因为表达式中有age(3)的值还未求出,于是需要计算age(3);//当n=3时,调用age(3),执行else部分c=age(3-1)+2=age(2)+2;此时并不往下执行,因为表达式中有age(2)的值还未求出,于是需要计算age(2);//当n=2时,调用age(2),执行else部分c=age(2-1)+2=age(1)+2;此时并不往下执行,因为表达式中有age(1)的值还未求出,于是需要计算age(1);//当n=1时,调用age(1),满足if中的条件,执行c=10;此时return c执行,age(1)执行结束,返回10;//知道age(1)后,age(2)、age(3)、age(4)、age(5),的值就可以相应求出并返回;//实际上就是:age(5)=age(4)+2=(age(3)+2)+2=((age(2)+2)+2)+2=(((age(1)+2)+2)+2)+2=(((10+2)+2)+2)+2=18;
[解决办法]
#include <stdio.h> void main() {int age(int n); printf("%d\n",age(5); } int age(int n) {int c; if(n==1) c=10; else c=age(n-1)+2; return(c); } +--------------------------+age(5)--->|age(4) +2| +-|------------------------+ | \|/ +-------------------+ |age(3) +2 | +|------------------+ | \|/ +-------------+ | age(2) +2 | +-|-----------+ | \|/ +------+ |10 +2| +------+
[解决办法]
就象给你一筒羽毛球,你想拿最里面那个.每个球就相当与递归的那个函数.
你要拿的球,拿到了retrun;其他的球,放回去return
那么你首先要从一个开始逐个拿出来,直到最里面那个球
拿到最后一个球 return
然后把倒数第二个球放进去 return
再然后把倒数第三个球放进去 return
........
[解决办法]
//当n=5时,调用age(5),执行else部分c=age(5-1)+2=age(4)+2;此时并不往下执行,因为表达式中有age(4)的值还未求出,于是需要计算age(4);
//当n=4时,调用age(4),执行else部分c=age(4-1)+2=age(3)+2;此时并不往下执行,因为表达式中有age(3)的值还未求出,于是需要计算age(3);
//当n=3时,调用age(3),执行else部分c=age(3-1)+2=age(2)+2;此时并不往下执行,因为表达式中有age(2)的值还未求出,于是需要计算age(2);
//当n=2时,调用age(2),执行else部分c=age(2-1)+2=age(1)+2;此时并不往下执行,因为表达式中有age(1)的值还未求出,于是需要计算age(1);
//当n=1时,调用age(1),满足if中的条件,执行c=10;此时return c执行,age(1)执行结束,返回10;
//知道age(1)后,age(2)、age(3)、age(4)、age(5),的值就可以相应求出并返回;
//实际上就是:age(5)=age(4)+2=(age(3)+2)+2=((age(2)+2)+2)+2=(((age(1)+2)+2)+2)+2=(((10+2)+2)+2)+2=18;
你没有仔细地看大家的回答啊!
[解决办法]
int age1(int n) { return(10); }int age2(int n) { int c; if(n==1) c=10; else c=age1(n-1)+2; return(c); }int age3(int n) { int c; if(n==1) c=10; else c=age2(n-1)+2; return(c); }
[解决办法]
楼主加油,帮顶