遞回演算法——菲波那契

2020-08-11 23:36:32

#遞回
是指函數/過程/子程式在執行過程式中直接或間接呼叫自身而產生的重入現象。在計算機程式設計裡,遞回指的是一個過程:函數不斷參照自身,直到參照的物件已知。使用遞回解決問題,思路清晰,程式碼少。但是在主流高階語言中(如C語言、Pascal語言等)使用遞回演算法要耗用更多的棧空間,所以在堆疊尺寸受限制時(如嵌入式系統或者內核態程式設計),應避免採用。所有的遞回演算法都可以改寫成與之等價的非遞回演算法。
(來源於百度,看不懂正常,術語就是不說人話)


###菲波那契數列:
斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…數列從第3項開始,每一項都等於前兩項之和。

先上程式碼:

import datetime


def fib(n):

    if n <2:

        return n

    else:
        return fib(n -1) + fib(n -2)

if __name__ == '__main__':
    n = int(input("請輸入一個正整數:"))
    time1 = datetime.datetime.now()
    print(str(n)+"序列上數位爲:",fib(n))
	time2	 = datetime.datetime.now()
    print("計算菲波那契數列鎖需要花費的時間。",time2-time1)

輸出:
請輸入一個正整數:3
3序列上數位爲: 2
計算菲波那契數列鎖需要花費的時間。 0:00:02.062182


明天繼續更新,加油!!!


遲到的更新

理解遞回思路,直接上程式碼

import datetime

def fib(n):

    if n < 2:
        print("f(" + str(n) + ")" + "=" + str(n),"遞回")
        return n

    else:
        print("f(" + str(n) + ")="  + "f(" + str(n - 1) + ")" + " + f(" + str(n - 2) + ")");
        r =  fib(n -1) + fib(n -2)
        print("f(" + str(n) + ")" + "=" + str(r))
        return r

if __name__ == '__main__':

    n = int(input("請輸入一個正整數:"))
    time1 = datetime.datetime.now()
    print(str(n)+"序列上數位爲:",fib(n))
    time2 = datetime.datetime.now()
    print("計算菲波那契數列鎖需要花費的時間。",time2-time1)

輸出:
請輸入一個正整數:5
f(5)=f(4) + f(3)
f(4)=f(3) + f(2)
f(3)=f(2) + f(1)
f(2)=f(1) + f(0)
f(1)=1 s
f(0)=0 s
f(2)=1
f(1)=1 s
f(3)=2
f(2)=f(1) + f(0)
f(1)=1 s
f(0)=0 s
f(2)=1
f(4)=3
f(3)=f(2) + f(1)
f(2)=f(1) + f(0)
f(1)=1 s
f(0)=0 s
f(2)=1
f(1)=1 s
f(3)=2
f(5)=5
5序列上數位爲: 5
計算菲波那契數列鎖需要花費的時間。 0:00:00.000294

從上面的步驟我們可以清晰的看到遞回演算法的第一步是分治,把複雜的大的問題,給拆分成一個一個小問題,直到不能再拆解,通過退出條件retrun,然後再從最小的問題開始解決,只到所有的子問題解決完畢,那麼最終的大問題就迎刃而解。上面的列印資訊,符合棧數據結構的定義,先進後出,通過把所有的子問題壓棧之後,然後再一個個出棧,從最簡單的步驟計算,最終解決大問題,非常形象。

f(5) = f(4) + f(3)
f(4)=f(3) + f(2)
f(3)=f(2) + f(1)
f(2)=f(1) + f(0)
f(1)返回值自身爲1
f(0)返回值自身爲0
f(2) = f(1) + f(0) = 1
f(3)= f(2) + f(1)
f(1)返回值自身爲1
f(3) = 2
f(4)=f(3) + f(2)
f(2)=f(1) + f(0)
f(1)返回值自身爲1
f(0)返回值自身爲0
f(2) = 1
f(4) = 3
以此類推下去最終得到結果f(n)