#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("不能是負數(shù). 請重新輸入. \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)//使用循環(huá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)一直都沒有執(zhí)行到return ans那句啊.那它怎么返回值啊.沒返回值怎么計算類?頭暈中~~~elseans=1;return ans;}好心幫幫我吧...我在遞歸這真的很迷茫啊~~~~
2 回答

慕斯709654
TA貢獻1840條經(jīng)驗 獲得超5個贊
if(n>0)
ans=n*rfact(n-1);
else
ans=1;
return ans;
當n>0時,執(zhí)行ans=n*rfact(n-1);,進行rfact壓棧,參數(shù)為n-1
可見,每次壓棧時,參數(shù)都遞減1,直到n=0。
當某一次執(zhí)行rfact函數(shù)時,n=0了,則if(n>0)不成立,執(zhí)行else語句,將ans賦值為1,
在else執(zhí)行完畢后,繼續(xù)執(zhí)行后面的return ans;,
這里就是遞歸的出口了,
從這里開始,依次退棧

楊魅力
TA貢獻1811條經(jīng)驗 獲得超6個贊
舉個例子 rfact(2)=2*rfact(1) = 2*1*rfact(0) = 2*1*1(因為rfact(0) = 1)
這樣不就出來啦?
- 2 回答
- 0 關注
- 199 瀏覽
添加回答
舉報
0/150
提交
取消