
少俠們好~
又和大家見(jiàn)面了,
(又可以和大家吹牛逼了~)
這次要分享的東西是一篇秘籍,

一篇簡(jiǎn)單的關(guān)于if, while和遞歸之間關(guān)系的秘籍。
不管少俠對(duì)它們了解的怎么樣,
希望這篇文章能夠?qū)δ阌心敲匆稽c(diǎn)點(diǎn)幫助~
或者,
發(fā)現(xiàn)一些有趣的東西也說(shuō)不定呢~
好了,
現(xiàn)在開(kāi)始進(jìn)入正題:
首先,這有一個(gè)熟悉的數(shù)組:

然后,
我們現(xiàn)在來(lái)使用迭代,
試著對(duì)它里面的數(shù)字進(jìn)行求和~
這里使用while語(yǔ)句,

少俠你一定覺(jué)得很簡(jiǎn)單是不是?
我們依次遍歷每個(gè)數(shù)字,
添加到sum上,直到數(shù)組的末尾。
不過(guò),
今天我們的任務(wù)是,
如何用遞歸的方式來(lái)實(shí)現(xiàn)這個(gè)功能。
實(shí)際上,
用遞歸替換掉while,
可能比少俠你想的要簡(jiǎn)單很多。
不信?
不信的話少俠請(qǐng)系好安全帶,
我們要發(fā)車了~
首先,第一步,
把while語(yǔ)句里面的內(nèi)容,
放進(jìn)一個(gè)函數(shù)里面:
同時(shí)我們給它一個(gè)名稱,
叫做addNext:

這個(gè)函數(shù)雖然簡(jiǎn)單,不過(guò)還是比較有趣的,
我們每調(diào)用一次,它就會(huì)像sum里面添加一個(gè)數(shù)字。
這是它的使用方式:

這里,
我們通過(guò)3次調(diào)用,
計(jì)算除了nums里面3個(gè)數(shù)字的總和,
不過(guò),
少俠你應(yīng)該會(huì)說(shuō),
“天辰,你這也太low了,我還得手動(dòng)一次一次調(diào)用?萬(wàn)一有100個(gè)數(shù)字呢?我難道還要手動(dòng)調(diào)用100次?”
沒(méi)錯(cuò),
少俠你可真是個(gè)小機(jī)靈鬼~
手動(dòng)調(diào)用這么笨的方法,我們當(dāng)然不會(huì)采用,
(剛才還在用呢。。。)
所以這里我們有2種選擇,
第一種!
把它放進(jìn)while里面,

好了,現(xiàn)在我們不用手動(dòng)調(diào)用了,
“???”
當(dāng)然,
這種情況和一開(kāi)始沒(méi)太大區(qū)別,一樣用了while,
只不過(guò)把while里面的內(nèi)容放進(jìn)函數(shù)里面了。。。
但是!
我們還有第二種選擇,
第二種選擇就是,
既然addNext是一個(gè)函數(shù)了,那么,
我們能不能在它內(nèi)部的末尾,讓它自己繼續(xù)調(diào)用addNext呢?
是可以的~
我們可以在addNext函數(shù)內(nèi)部,增加個(gè)判斷,
如果還有數(shù)字,讓它自動(dòng)調(diào)用addNext添加下一個(gè)數(shù)字。

好了,
完全OK~
今天的內(nèi)容就到這里了。。。
“完了?”
“對(duì)啊,完了,沒(méi)有while了啊?!?/p>
“你干某些事的時(shí)候速度也這么快嗎~”
“。。。。。?!?/p>
好吧,
這么結(jié)束是有點(diǎn)不好。。
看看上面的函數(shù),
少俠你應(yīng)該可以發(fā)現(xiàn)了,
我們的addNext函數(shù),就是一個(gè)遞歸函數(shù),
也是它,幫助我們替代掉了while的功能,
不過(guò),
我們外部的addAll函數(shù)并不算一個(gè)遞歸函數(shù),
它內(nèi)部的addNext函數(shù)才是,
那么,有沒(méi)有辦法使它自己就變成一個(gè)遞歸函數(shù)呢?
也是可以的!
不過(guò)這次我們重點(diǎn)不在這里,
這次我們想關(guān)注的是,
為什么我們可以使用遞歸來(lái)代替循環(huán),
以及if, while和遞歸之間的關(guān)系。
少俠你平時(shí)應(yīng)該已經(jīng)用了非常多的if和while,
多到你可能都認(rèn)為你完全理解它們了,
但是~
我想說(shuō)少俠你還是太年輕了,
比如,
少俠你知道下面這句話什么意思不?
“if是懶惰的while, 除非它遇見(jiàn)了遞歸?!?/p>
不知道是吧?
你當(dāng)然不知道,
因?yàn)檫@是我編的,哈哈哈哈~
“天辰!少?gòu)U話了,有話趕緊說(shuō),有牛逼趕緊吹,大家時(shí)間都很寶貴的!”
好吧,
少俠請(qǐng)看:

“???”
“這不才上面看過(guò)嗎?天辰你是不是粘貼錯(cuò)了?”
沒(méi)錯(cuò)沒(méi)錯(cuò)~
這就是我們上面的代碼,
但是現(xiàn)在我們要從另一個(gè)角度來(lái)看待它,
在這段代碼里,while會(huì)不斷遍歷nums,直到所有的數(shù)字都添加完成,
那么,如果我們把while換成if,會(huì)是什么情況呢?

很明顯,
因?yàn)閕f只會(huì)執(zhí)行里面的代碼一次,所以它只添加了第一個(gè)數(shù)字1到sum里面。
如果我們想實(shí)現(xiàn)和while一樣的效果的話,我們得手動(dòng)告訴if,讓它多執(zhí)行幾次,
因?yàn)樗軕校悦看涡枰覀兲嵝褈

“又來(lái)了又來(lái)了!天辰我都說(shuō)了,如果nums是[1,2,3,4,5,6,7,8,9,10],那你不得寫10個(gè)if? 如果是100個(gè),1000個(gè)呢?”
我知道我知道!
按照現(xiàn)在這樣,如果nums長(zhǎng)度變長(zhǎng)了,就變成下面這樣了:

這就是為什么我們開(kāi)始要用一個(gè)函數(shù)把if的代碼包裹起來(lái),
為什么呢?
因?yàn)椋?/p>
我們不能在if語(yǔ)句內(nèi)部告訴它重復(fù)執(zhí)行當(dāng)前if語(yǔ)句,

但是我們卻可以在函數(shù)內(nèi)部,告訴它重復(fù)調(diào)用當(dāng)前函數(shù),

所以,我們把if語(yǔ)句放在函數(shù)內(nèi)部,
然后重復(fù)調(diào)用這個(gè)函數(shù),就可以實(shí)現(xiàn)重復(fù)調(diào)用if的效果。

OK~
我們又一次的用遞歸替換掉了while迭代。
怎么樣,
很簡(jiǎn)單吧?少俠~
好了,
現(xiàn)在真要結(jié)束了,
恭喜少俠你又成功發(fā)現(xiàn)并閱讀完了一篇文章~
按照慣例,首先~
謝謝少俠你看到了這里,
然后~
現(xiàn)在少俠你應(yīng)該大概知道了if, while 和遞歸之間的關(guān)系了。
也應(yīng)該知道了如何用遞歸替換掉代碼中的循環(huán),
不過(guò),
少俠也許你可以多想想,
為什么我們能用遞歸替換掉迭代?
是哪些規(guī)則支撐了我們完成這些操作呢?
我們?cè)赼ddNext函數(shù)內(nèi)部通過(guò)函數(shù)名稱訪問(wèn)到了addNext,
從而可以調(diào)用它執(zhí)行下一次操作,
那么,如果是匿名函數(shù)呢?
不管怎樣,
希望少俠你能試著以自己的方式理解一下,
弄清楚他們到底在做什么~
然后,
做一些好玩的東西~
“叮~ 恭喜你找到藍(lán)色的recursion殘卷,已成功添加到儲(chǔ)物袋里。”
image

額外的資源:
少俠還記得上一次我們提到的compose和pipeline函數(shù)嗎?
如果你有興趣,
少俠你應(yīng)該試著按照上面的步驟實(shí)現(xiàn)遞歸的compose和pileline函數(shù)了。
不要立刻偷看下面的答案!
compose函數(shù):

pipeline函數(shù)的過(guò)程幾乎一模一樣,這里就不再重復(fù)了,
免得你們說(shuō)我啰嗦!
一些你可能關(guān)心的問(wèn)題:
1、天辰,這次更新的時(shí)間好像比上次長(zhǎng)一點(diǎn),干嘛去了?
這次是比較長(zhǎng),主要是最近狀態(tài)不太好,有時(shí)候不知道寫點(diǎn)什么好,然后寫完了自己讀著又總是感覺(jué)怪怪的,就翻來(lái)覆去改了幾次。。。要是我自己都不滿意的話,就沒(méi)必要發(fā)出來(lái)了,感覺(jué)挺尷尬的。
2、天辰,為什么你這里貼的compose,pipeline函數(shù),和上次你用的遞歸方式不一樣呢?
沒(méi)錯(cuò),是不一樣,上次用的方式?jīng)]有中間函數(shù),compose和pipeline函數(shù)本身就是一個(gè)遞歸函數(shù),而且用的判斷條件也不一樣,少俠你可以自己對(duì)比著看看。
3、還有,到底怎么讓addAll自己本身是一個(gè)遞歸函數(shù)呢? 而不用借助中間函數(shù)呢?
這個(gè)問(wèn)題嘛,其實(shí)也不難解決,而且解決它的辦法和if,while這些知識(shí)一樣,都是你經(jīng)常用的,只不過(guò),你可能沒(méi)有意識(shí)到,哈哈,就不給你說(shuō)~
(不過(guò)。。。也許你可以對(duì)比著上次的compose和pipeline函數(shù)看看~)
好了,
少俠,江湖路上,有緣再見(jiàn)~
