#include<stdio.h>long fact (int n);long rfact (int n);int main(void){int num;printf("这个程序是计算阶乘的.\n");printf("输入一个范围 0-12 (q为退出):\n");while(scanf("%d",&num)==1){if(num<0)printf("不能是负数. 请重新输入. \n");else if(num>12)printf("不能大于 12.\n");else{printf("loop: %d factorial = %ld\n",num,fact(num));printf("recursion: %d factorial = %ld\n",num,rfact(num));}printf("输入一个范围 0-12 (q为退出):\n");}printf("Bye.\n");return 0;}long fact(int n)//使用循环计算阶乘{long ans;for(ans=1;n>1;n--)ans*=n;return ans;}long rfact(int n)//使用递归计算阶乘{int ans;if(n>0)ans=n*rfact(n-1);//这个递归是怎么算的啊...rfact(n-1)一直都没有执行到return ans那句啊.那它怎么返回值啊.没返回值怎么计算类?头晕中~~~elseans=1;return ans;}好心帮帮我吧...我在递归这真的很迷茫啊~~~~
2 回答

慕斯709654
TA贡献1840条经验 获得超5个赞
if(n>0)
ans=n*rfact(n-1);
else
ans=1;
return ans;
当n>0时,执行ans=n*rfact(n-1);,进行rfact压栈,参数为n-1
可见,每次压栈时,参数都递减1,直到n=0。
当某一次执行rfact函数时,n=0了,则if(n>0)不成立,执行else语句,将ans赋值为1,
在else执行完毕后,继续执行后面的return ans;,
这里就是递归的出口了,
从这里开始,依次退栈
- 2 回答
- 0 关注
- 223 浏览
添加回答
举报
0/150
提交
取消