亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

遞歸函數(一)

#include <stdio.h>

/* 定義獲取單詞數量的函數 */

int getWordNumber(int n)

{ ??

? ? if(n == 1)

? ? {

? ? ? ? return 1; ? ?//第一天只會1個單詞

? ? }

? ? else

? ? {

? ? ? ? return getWordNumber(n-1)+n ; ? ? ? //到第天會的單詞數量

? ? }

}

int main()

{

? ? int num = getWordNumber(10); ? ? //獲取會了的單詞數量

? ? printf("小明第10天記了:%d個單詞。\n", num);

? ? return 0;

}

遞歸函數,是碰到什么條件停止循環的?到最后為什么不是getWordNumber(1-1)+1?


正在回答

2 回答

因為getWorldNumber的值已經確定了是1,所以就不會再繼續執行getWorldNumber(n-1)+n了。

在主方法main中調用了getWordNumber方法,當函數走到int num = getWordNumber(10)時又會返回去調用getwordNumber方法;反復執行直到滿足遞歸函數終結條件停止;

遞歸函數的執行過程:執行時遇到getWordNumber(10),保存當前的n(n-1)+n以及getWordNumber(10)執行完后的返回地址;然后繼續執行,繼續對局部變量和函數返回地址入棧保存。直到遇到遞歸結束條件,開始彈棧,這是將棧頂n域值恢復給n,棧頂地址域作為返回地址出棧,繼續這樣下去,直到???/p>


2 回復 有任何疑惑可以回復我~
#1

那誰很靠譜3587144 提問者

多謝,我先去查查什么是棧,回來要是能看明白,一定會采納的
2016-10-24 回復 有任何疑惑可以回復我~
#2

JustWannaHugU 回復 那誰很靠譜3587144 提問者

好的。 棧就是一個后進先出的容器而已
2016-10-24 回復 有任何疑惑可以回復我~
#3

那誰很靠譜3587144 提問者 回復 JustWannaHugU

if(n == 1) { return 1; //第一天只會1個單詞 } 當n==1的時候,return 1(輸出1),可是為什么最后輸出的是return getWordNumber(n-1)+n這個呢?
2016-10-24 回復 有任何疑惑可以回復我~
#4

JustWannaHugU 回復 那誰很靠譜3587144 提問者

?你說明白點
2016-10-24 回復 有任何疑惑可以回復我~
#5

JustWannaHugU 回復 那誰很靠譜3587144 提問者

第一次調用時n=10,就會return getWordNumber(n-1)+n,也就是getWordNumber(10-1)+10; 而getWordNumber(10-1)返回的是getWordNumber(9-1)+9; ...一直往下減 getWordNumber(2)返回getWordNumber(2-1)+2; 但是到了這時候就會出現 getWordNumber(1)返回1; 于是開始逐層往上return值了(因為從一開始就沒有計算完畢) getWordNumber(10)=getWordNumber(1)+2+3+4+5+6+7+8+9+10=55.至此程序執行完畢
2016-10-24 回復 有任何疑惑可以回復我~
#6

那誰很靠譜3587144 提問者 回復 JustWannaHugU

這個真是挺難理解,感覺比原來的課加一塊都難理解,我去度娘視頻看看是不是好理解一些,謝謝大神先
2016-10-24 回復 有任何疑惑可以回復我~
#7

那誰很靠譜3587144 提問者

非常感謝!
2016-10-24 回復 有任何疑惑可以回復我~
查看4條回復

回復 JustWannaHugU:#include <stdio.h>

/* 定義獲取單詞數量的函數 */

int getWordNumber(int n)

{ ??

? ? if(n == 1)//那么,最后為什么不是直接輸出這個呢?如果這個不成立,不是才執行下面的else嗎?

? ? {

? ? ? ? return 1; ? ?

? ? }

? ? else

? ? {

? ? ? ? return getWordNumber(n-1)+n ; //這里一直最后會成(1-1)+1對嗎???? ? ? ?

? ? }

}

int main()

{

? ? int num = getWordNumber(10); ? ? //獲取會了的單詞數量

? ? printf("小明第10天記了:%d個單詞。\n", num);

? ? return 0;

}


0 回復 有任何疑惑可以回復我~
#1

JustWannaHugU

你再好好看看遞歸吧,在紙上寫寫
2016-10-24 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消
C語言入門
  • 參與學習       927002    人
  • 解答問題       21533    個

C語言入門視頻教程,帶你進入編程世界的必修課-C語言

進入課程

遞歸函數(一)

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號