遞歸

上大學那會兒很難理解什麼是遞歸,老師照着課本念,課本也是說地很簡潔,就是程序自己調用自己本身,這沒啥毛病,可就是不能理解自己調用自己,所以有很長一段實際思維一直禁錮在遞歸中無法自拔,直到後來自己看了很多關於遞歸的文章才慢慢看透遞歸的本質,後來在一次公司的技術分享會上剛好有一個大佬同事分享了一個青蛙跳臺階的遞歸例子,感覺很通俗易懂。

首先假設我們有一個10個階梯的樓梯,青蛙每次跳只能跳一階或者兩階,多了跳不上去了,這很好理解吧,那青蛙跳到第10階有多少跳法呢?

這看起來有點像概率論,每一次跳可以是1,也可以是2,問這兩種組合方式有多少種?
當然我們在這裏不考慮概率論的問題,我們討論如何用遞歸算出它一共有多少種跳法。

用自頂向下的思維方式,通過分析我們發現,要想到達第10個階梯那麼它最後一次跳只有兩種情況,跳了1階或者2階,也就是它要麼從第9階跳上去,要麼從第8階跳上去,假設青蛙從第9階跳上去的,那麼它倒數第二次跳要麼是從7個階梯跳上去的,要麼是第8個階梯跳上去的,同理,假設青蛙從第8階梯跳上去的,那麼它前一次也有兩種可能。

總結:

青蛙每跳一次臺階,它都有兩種可能,跳一階和跳兩階,但凡是都有例外,那就是當階梯爲1的時候它只有一種跳法,跳一階,當階梯等於2的時候只有兩種方法,跳1階兩次和跳一次2階。
這樣就得到一個公式:

{f(n)=1 f(n)=2 f(n)=f(n1)+f(n2)  \begin{cases} f(n)= 1 [n=1]\\ f(n)= 2 [n=2]\\ f(n)= f(n-1)+f(n-2) [n>2] \end{cases}

python代碼實現如下,很精簡,這就是python的風格

def func(n):
    if n <= 0:
        return 'erro'
    if n == 1:
        tmp = 1
    elif n == 2:
        tmp = 2
    else:
        tmp = func(n-1) + func(n-2)
    return tmp

print(func(10))

遞歸的方法就是一層層地去找答案,想要直到f(n)就要知道f(n-1)f(n-2),想要知道f(n-1)f(n-2)又必須知道f(n-1)的前一項和前兩項以及f(n-2)的前一項和前兩項,一直推導下去,直到某個結果能夠打破這一平衡,導致所有項都能被求出來,那麼遞歸就結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章