为了账号安全,请及时绑定邮箱和手机立即绑定

rfact(n-1)一直都没有执行到return ans那句?是什么情况?

rfact(n-1)一直都没有执行到return ans那句?是什么情况?

阿晨1998 2022-07-21 16:11:26
#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;,
这里就是递归的出口了,
从这里开始,依次退栈

查看完整回答
反对 回复 2022-07-24
?
杨魅力

TA贡献1811条经验 获得超6个赞

举个例子 rfact(2)=2*rfact(1) = 2*1*rfact(0) = 2*1*1(因为rfact(0) = 1)
这样不就出来啦?

查看完整回答
反对 回复 2022-07-24
  • 2 回答
  • 0 关注
  • 223 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号