少俠留步!你知道if、while和遞歸之間的關(guān)系嗎?

image

少俠們好~

又和大家見(jiàn)面了,

(又可以和大家吹牛逼了~)

這次要分享的東西是一篇秘籍,

image

一篇簡(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ù)組:

image

然后,

我們現(xiàn)在來(lái)使用迭代,

試著對(duì)它里面的數(shù)字進(jìn)行求和~

這里使用while語(yǔ)句,

image

少俠你一定覺(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:

image

這個(gè)函數(shù)雖然簡(jiǎn)單,不過(guò)還是比較有趣的,

我們每調(diào)用一次,它就會(huì)像sum里面添加一個(gè)數(shù)字。

這是它的使用方式:

image

這里,

我們通過(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里面,

image

好了,現(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ù)字。

image

好了,

完全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)看:

image

“???”

“這不才上面看過(guò)嗎?天辰你是不是粘貼錯(cuò)了?”

沒(méi)錯(cuò)沒(méi)錯(cuò)~

這就是我們上面的代碼,

但是現(xiàn)在我們要從另一個(gè)角度來(lái)看待它,

在這段代碼里,while會(huì)不斷遍歷nums,直到所有的數(shù)字都添加完成,

那么,如果我們把while換成if,會(huì)是什么情況呢?

image

很明顯,

因?yàn)閕f只會(huì)執(zhí)行里面的代碼一次,所以它只添加了第一個(gè)數(shù)字1到sum里面。

如果我們想實(shí)現(xiàn)和while一樣的效果的話,我們得手動(dòng)告訴if,讓它多執(zhí)行幾次,

因?yàn)樗軕校悦看涡枰覀兲嵝褈

image

“又來(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)了,就變成下面這樣了:

image

這就是為什么我們開(kāi)始要用一個(gè)函數(shù)把if的代碼包裹起來(lái),

為什么呢?

因?yàn)椋?/p>

我們不能在if語(yǔ)句內(nèi)部告訴它重復(fù)執(zhí)行當(dāng)前if語(yǔ)句,

image

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

image

所以,我們把if語(yǔ)句放在函數(shù)內(nèi)部,

然后重復(fù)調(diào)用這個(gè)函數(shù),就可以實(shí)現(xiàn)重復(fù)調(diào)用if的效果。

image

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ù):

image

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)~

image
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容