|
发表于 2014-4-9 17:29:23
|
显示全部楼层
本帖最后由 紫月冰蓝 于 2014-4-9 17:33 编辑
假设求n!:
假设n=4
fac(int n)
{
int t;
if(n==1||n==0) return 1; // 这里是1号
else
{
t=n*fac(n-1); //这里是2号
return t; //这里是3号
}
}
这里当主函数第一次调用fac时,系统为形参n开辟了存储单元, 为了区分,这个单元假设叫n1,把4的值传给n1,
同时系统为变量t开辟单元,假设叫t1;因为n1的值大于1,程序执行第2号语句中的赋值语句,按运算规律,应该先求等号右边的表达式的值;在此表达式中用实参n-1(值为3)又一次调用了fac函数自己,
进入第二次调用fac,系统为形参n开辟了一个新的单元n2,把3的值传给n2,同时系统为变量t开辟了新的单元t2,程序再次执行第2号语句,又一次调用了fac函数自己,这时实参n-1值为2.
进行第三次调用fac,与第二次相同,只是形参n3的值为2,程序再次执行第2号语句,又一次调用自己,实参n-1的值为1
进行第四次调用fac,与第二次机同,只是形参n4的值为1,这时执行第1号语句中if语句后面的return,递归调用结束,同时结束本次调用,返回函数值1,本次调用中形参n4与变量t4所占的单元被释放,
程序返回到第三次调用中第2号语句的调用点,表达式n*fac(n-1)中,fac函数的返回值是1,n3中的值是2,因此表达式的值为2,赋给t3;接着执行第3号语句中的return语句,本次调用结束,返回函数值2,同时n3和t3所占单元被释放.
程序返回到第二次调用中第2号语句的调用点,表达式n*fac(n-1)中,fac函数的返回值是2,n2中的值是3,因此表达式的值为6,赋给t2;接着执行第3号语句中的return语句,本次调用结束,返回函数值6,同时n2和t2所占单元被释放.
程序返回到第一次调用中第2号语句的调用点,表达式n*fac(n-1)中,fac函数的返回值是6,n1中的值是4,因此表达式的值为24,赋给t1;接着执行第3号语句中的return语句,本次调用结束,返回函数值24,同时n1和t1所占单元被释放.
程序返回到main主函数中的调用点,函数值为24 ,函数调用到此结束,继续执行其它语句.
个人感觉递归调用就是不断的在调用函数的时候开避新的变量,,把形参中的值赋值给新的变量,用新的变量当函数的新值再去调用函数本身,直到条件成立依次层层退出函数
|
|