2 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
“階乘問(wèn)題中不斷遞歸得出結(jié)果即可,而這個(gè)問(wèn)題...” 從這句話來(lái)看,你可能也并沒(méi)有真正理解那個(gè)階乘的遞歸過(guò)程。因?yàn)檫@兩個(gè)代碼邏輯都是“遞歸”,并沒(méi)有本質(zhì)的區(qū)別。
為什么你會(huì)覺(jué)得“后面的語(yǔ)句不會(huì)執(zhí)行”呢??這或許說(shuō)明,你可能沒(méi)搞清楚函數(shù)的執(zhí)行流程(不僅指遞歸函數(shù))。
我?guī)湍阏硐滤悸罚阍囍治鱿逻@個(gè) change 函數(shù)的執(zhí)行流程:
你疑惑的那三條語(yǔ)句存在于函數(shù)中,前面也沒(méi)有必然的 return 語(yǔ)句跳過(guò)它們,為什么不會(huì)被執(zhí)行呢!
哦,前面是有個(gè) return,但那是在 if 中,也就是只有當(dāng)參數(shù) n 為 0 時(shí)才會(huì)執(zhí)行那個(gè) return。那么當(dāng)參數(shù) n 不為 0 時(shí),if 后面的語(yǔ)句都會(huì)被依序執(zhí)行的。你仔細(xì)想想代碼的執(zhí)行流程,是不是這樣?
if 語(yǔ)句后面的語(yǔ)句具體來(lái)說(shuō)有 4 條:
change函數(shù)調(diào)用
len=strlen(s);
s[len]=bit[n%b];
s[len+1]='\0';
不要被又調(diào)用了 change 搞亂思路。從函數(shù)執(zhí)行流程上來(lái)說(shuō),這只不過(guò)是調(diào)用了一個(gè)函數(shù)而已,和調(diào)用別的什么函數(shù)沒(méi)有區(qū)別!? 注意:我們這里只分析代碼的執(zhí)行流程。如果 change 這個(gè)名字會(huì)引起你的混亂,那么我們暫稱(chēng)它為“abc函數(shù)”好了。
那么最基礎(chǔ)的知識(shí):當(dāng)abc函數(shù)調(diào)用執(zhí)行結(jié)束之后,該執(zhí)行哪個(gè)語(yǔ)句?? 當(dāng)然是abc函數(shù)調(diào)用語(yǔ)句后面的語(yǔ)句了!? 所以,當(dāng) change 函數(shù)調(diào)用結(jié)束后,len = strlen(s);... 這三條語(yǔ)句都會(huì)依次執(zhí)行的。
好了,到這里,你是否理清了 change 的具體執(zhí)行流程呢? 只是說(shuō)執(zhí)行流程,先別管每一次的執(zhí)行結(jié)果。
如果你明白了執(zhí)行流程,那么你可以用簡(jiǎn)單的例子,在紙上推演下在上述流程中的每一步都發(fā)生了什么。比如“15 轉(zhuǎn)八進(jìn)制”(你提到的轉(zhuǎn)二進(jìn)制步驟太多,紙上推演的話太麻煩了)
如果你能成功推演,那么你就已經(jīng)搞明白了這個(gè)遞歸是怎么回事。 如果不能再告訴我,我?guī)湍阃蒲荨?/p>

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
如果你對(duì)此代碼的疑惑是在“這個(gè)函數(shù)一直調(diào)用自己...”這里,那么你應(yīng)該先去理解下什么是“遞歸”。
這個(gè)代碼中“一直調(diào)用自己”的行為就是遞歸。下面那些語(yǔ)句當(dāng)然不是沒(méi)用的,它們會(huì)被執(zhí)行到的。
當(dāng)你明白了遞歸如何工作后,就能弄明白這段代碼的行為。所以,先去理解下遞歸吧。
我之前曾經(jīng)解釋過(guò)關(guān)于遞歸的問(wèn)題,你試著參考下,看看能不能明白遞歸的運(yùn)作方式:http://idcbgp.cn/qadetail/90499
- 2 回答
- 0 關(guān)注
- 1146 瀏覽
添加回答
舉報(bào)