課程
/后端開(kāi)發(fā)
/C
/C語(yǔ)言入門
那個(gè)遞歸函數(shù)到底咋樣運(yùn)行的?
2015-07-11
源自:C語(yǔ)言入門 5-8
正在回答
遞歸函數(shù)就是將在自己方法本身調(diào)用自身,可以舉個(gè)生活中的小例子
例如某天,一個(gè)老師讓他拿著一堆數(shù)字開(kāi)片,他給自己的學(xué)生每個(gè)人一張,,老師只要求大于等于0的人來(lái)按順序排隊(duì),他將一個(gè)50給了第一個(gè)人,然后要求比他小10的人站出來(lái),之后要求比前一個(gè)(就是50-10,拿到40的人)小10的人站出來(lái),然后再出來(lái)一個(gè)比上一個(gè)小10的人出來(lái),以此類推,直到有拿到了0的站出來(lái),那么這一隊(duì)當(dāng)中就有了
50,40,30,20,10,0這幾數(shù)字的持有者,老師要求大于等于0的人就是這個(gè)遞歸的結(jié)束語(yǔ)句,因?yàn)橹灰蟠笥诘扔?的,最后一個(gè)是0,比他小10的人肯定不大于他,所以遞歸結(jié)束
int?getSum(int?n);????//定義方法 int?main()????//主函數(shù),程序入口 { ????int?i?=?getSum(50);????//定義一個(gè)變量用于接收getNum方法的返回值 ????printf("這幾個(gè)人手中的卡片總和為%d\n",i); } int?getSum(int?n)????//剛剛定義了getSum方法,這里是具體實(shí)行 {?????//這兩個(gè)方法中的?i?都是在方法中定義,為局部變量,所以互不干擾 ????if(n?>?0) ????{ ????????int?i?=?getSum(n-10)?+?n;??//以下進(jìn)行詳細(xì)解析,解析代碼不符合標(biāo)準(zhǔn)寫(xiě)法,只是形式相同 ????????return?i; ?????} ?????return?0;//在n的值小于0以前不執(zhí)行這個(gè) }
這個(gè)代碼它的實(shí)際流程是這樣,主函數(shù)還是上面那個(gè),不寫(xiě)了
int?getSum(int?n)?//主函數(shù)調(diào)用時(shí)傳入實(shí)參給此形參,實(shí)參值為50,所以這個(gè)形參也就是50 {?????????????????//?1?剛剛調(diào)用了本方法,并且傳入了40,往下執(zhí)行 ??????????????????//?2?剛剛調(diào)用了本方法,并且傳入了30,往下執(zhí)行 ??????????????????//?3?剛剛調(diào)用了本方法,并且傳入了20,往下執(zhí)行 ??????????????????//?4?剛剛調(diào)用了本方法,并且傳入了10,往下執(zhí)行 ??????????????????//?5?剛剛調(diào)用了本方法,并且傳入了0,往下執(zhí)行 ????????????????? ?????if(n?>?0)????//步驟?5?的值是?0?,一個(gè)數(shù)是不大于自身的,所以?0?不大于?0,不滿足,if當(dāng)中的不執(zhí)行 ?????{ ?????????int?i?=?getSum(n?-?10)?+?n;?//此處傳入n?-?10,也就是將40傳入,然后調(diào)用本方法,步驟?1 ?????????????????????????????????????//執(zhí)行到此說(shuō)明?n?還是大于0,將40-10傳入調(diào)用本方法,步驟2 ??????????????????????????????????????//執(zhí)行到此說(shuō)明?n?還是大于0,將30-10傳入調(diào)用本方法,步驟3 ??????????????????????????????????????//執(zhí)行到此說(shuō)明?n?還是大于0,將20-10傳入調(diào)用本方法,步驟4 ??????????????????????????????????????//執(zhí)行到此說(shuō)明?n?還是大于0,將10-10傳入調(diào)用本方法,步驟5 ??????????????????????????????????????//由于步驟5傳入的值是0,不滿足if判斷,所以沒(méi)法在執(zhí)行這里 ?????????????????????????????????????? ??????????????????????????????????????//接收到步驟?5?所返回的值,執(zhí)行?i?=?0?+?n,此處的?n?為10?,然后執(zhí)行return返回?0+10?結(jié)果給調(diào)用步驟4的方法 ??????????????????????????????????????//接收到步驟?4?所返回的值,執(zhí)行?i?=?10?+?n,此處的?n?為20?,然后執(zhí)行return返回?10?+?20?結(jié)果給調(diào)用步驟3的方法 ??????????????????????????????????????//接收到步驟?3?所返回的值,執(zhí)行?i?=?30+?n?,?此處的?n?為30,然后執(zhí)行return返回?30?+?30?結(jié)果給調(diào)用步驟2的方法 ?????????????????????????????????????//接收到步驟?2?所返回的值,執(zhí)行?i?=?60?+?n?,?此處的?n?為?40,然后執(zhí)行return返回?60?+?40?結(jié)果給調(diào)用步驟1的方法 ?????????????????????????????????????//接收到步驟?1?所返回的值,執(zhí)行?i?=?100?+?n?,?此處的?n?為?50,然后執(zhí)行return返回?100?+?50?結(jié)果給main方法 ?????????return?i;???????????????????? ????????? ?????} ?????return?0;?//返回一個(gè)值給剛剛調(diào)用步驟?5?的方法 }
用起來(lái)沒(méi)覺(jué)得的,說(shuō)起來(lái)真亂,我想不到通俗的解釋,如果覺(jué)得太亂了就別看了,免得被我誤人子弟。。。
黃鋒 提問(wèn)者
qq_Guardianship_0
好厲害,程序猿我敬你
你說(shuō)的更加復(fù)雜,不過(guò)你學(xué)的很好啊,大神
舉報(bào)
C語(yǔ)言入門視頻教程,帶你進(jìn)入編程世界的必修課-C語(yǔ)言
2 回答求能詳細(xì)解釋一下
1 回答詳細(xì)解釋代碼
2 回答能詳細(xì)的解釋一下運(yùn)行過(guò)程嗎?
1 回答switch 語(yǔ)句詳細(xì)解釋
1 回答有沒(méi)有誰(shuí)能寫(xiě)出詳細(xì)過(guò)程???
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號(hào)-11 京公網(wǎng)安備11010802030151號(hào)
購(gòu)課補(bǔ)貼聯(lián)系客服咨詢優(yōu)惠詳情
慕課網(wǎng)APP您的移動(dòng)學(xué)習(xí)伙伴
掃描二維碼關(guān)注慕課網(wǎng)微信公眾號(hào)
2015-07-12
遞歸函數(shù)就是將在自己方法本身調(diào)用自身,可以舉個(gè)生活中的小例子
例如某天,一個(gè)老師讓他拿著一堆數(shù)字開(kāi)片,他給自己的學(xué)生每個(gè)人一張,,老師只要求大于等于0的人來(lái)按順序排隊(duì),他將一個(gè)50給了第一個(gè)人,然后要求比他小10的人站出來(lái),之后要求比前一個(gè)(就是50-10,拿到40的人)小10的人站出來(lái),然后再出來(lái)一個(gè)比上一個(gè)小10的人出來(lái),以此類推,直到有拿到了0的站出來(lái),那么這一隊(duì)當(dāng)中就有了
50,40,30,20,10,0這幾數(shù)字的持有者,老師要求大于等于0的人就是這個(gè)遞歸的結(jié)束語(yǔ)句,因?yàn)橹灰蟠笥诘扔?的,最后一個(gè)是0,比他小10的人肯定不大于他,所以遞歸結(jié)束
這個(gè)代碼它的實(shí)際流程是這樣,主函數(shù)還是上面那個(gè),不寫(xiě)了
用起來(lái)沒(méi)覺(jué)得的,說(shuō)起來(lái)真亂,我想不到通俗的解釋,如果覺(jué)得太亂了就別看了,免得被我誤人子弟。。。
2015-08-15
好厲害,程序猿我敬你
2015-07-12
你說(shuō)的更加復(fù)雜,不過(guò)你學(xué)的很好啊,大神