對于遞歸,有沒有什么好的理解方法?(要想理解遞歸請先理解遞歸)

公眾號GitPython

小時候,你一定聽說過這樣一個故事:“從前有座山,山上有座廟,廟里有個老和尚,正在給小和尚講故事呢,講的什么故事呢:‘從前有座山,山上有座廟...’”

或許,你一定有過這樣的經(jīng)歷,每逢節(jié)假日回家,坐公交的時候,人都特別多。記得那一次,你著急回家,不得不從后面的門上了車。上車之后,你得刷卡呀,人太多過不去咋辦,你只能把卡傳給你前面的人讓他幫你刷,你前面的人也夠不著咋辦,只能再繼續(xù)往前傳,就這樣,終于傳到最后一個人手里,刷了卡,并且卡還得原路返回,還到你手上。

想想這兩個故事,再想想編程的時候,在函數(shù)中調(diào)用函數(shù)本身,是不是有點似曾相識了!這就是遞歸。

遞歸有三個要素。

以最常見的斐波那契數(shù)列,來通俗的解釋一下這三個要素。


斐波那契數(shù)列:

1,1,2,3,5,8,13,21...


第一,要知道你寫的函數(shù)是干什么的。

f(1)=1??

f(2)=1?

f(3)=2?

f(4)=3?

f(5)=5

那么,f(n)=?

顯然,我們的函數(shù)就是要求得f(n)的值。


第二,遞歸表達(dá)式

f(1)=1??

f(2)=1

f(3)=f(1)+f(2)=2?

f(4)=f(2)+f(3)=3?

f(5)=f(3)+f(4)=5

...

f(n)=f(n-2)+f(n-1)

這就是遞歸表達(dá)式了!是不是感覺也不是很難呀!


第三,遞歸的出口

要知道f(n),就得知道f(n-1)和f(n-2),以此類推,最后會到f(1)和f(2)停止。所以f(1)=f(2)=1就是遞歸的出口了。

對照源碼看一下:

斐波那契數(shù)列

現(xiàn)在,你知道了斐波那契數(shù)列。

那么,試著想一下這個題目:一只青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法。

分析一波:

青蛙每次跳的時候都有兩種選擇。


第一種選擇:第一次跳一個臺階,剩下的n-1個臺階的跳法有f(n-1)種。

第二種選擇:第一次跳兩個臺階,剩下的n-2個臺階的跳法有f(n-2)種。


所以,青蛙的跳法就是這兩種跳法之和,即 f(n) = f(n-1) + f(n-2)。


臥槽,是不是又似曾相識了哇!褪下那一層神秘的面紗,又回到了斐波那契數(shù)列。接下來,就是和上面一樣的步驟了。

說了這么多,再來看一個例子(階乘的計算)鞏固一下。

第一個要素:函數(shù)的作用:計算階乘

第二個要素:遞歸表達(dá)式:f(n)=f(n-1)*n

第三個要素:遞歸出口:f(1)=1

對照源碼:

階乘

總結(jié)一下:

編寫遞歸代碼的關(guān)鍵就是不要把自己繞進(jìn)去,正確姿勢是寫出遞推公式,找出終止條件,然后再翻譯成遞歸代碼。

1、遞歸的三要素

2、斐波那契數(shù)列、青蛙跳臺階、計算階乘


要想理解遞歸,請先理解遞歸。


你看懂了嗎?

想要了解更多通俗易懂的編程知識,請關(guān)注公眾號【GitPython

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

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

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