程式設計求斐波那契數列

2021-09-29 10:56:46 字數 1763 閱讀 1177

fibonacci sequence

***** recursive algorithm

def

fib(n)

:if n ==

1or n ==2:

return

1else

:return fib(n -1)

+ fib(n -

2)

這是很樸素的思想, 是一種從上到下的方法,但是重複計算了很多之前計算過的結果,時間複雜度是指數級.具體為ω(φ

n)

\omega(\varphi ^n)

ω(φn

),其中φ=1

+5

2\varphi = \frac}

φ=21+5

​​bottom-up algorithm

def

fib2

(n):

if n ==

1or n ==2:

return

1

f1 =

1 f2 =

1for i in

range(3

, n+1)

: c = f1 + f2

f1 = f2

f2 = c

return c

避免了重複計算,時間複雜度為o(n

)o(n)

o(n)

利用數學技巧 mathematical trick

***** recursive squaringfib

n=φn

5fib_n = \frac}

fibn​=

5​φn

​離他最近的整數就是第n個斐波那契數.

這個演算法的時間複雜度是o(l

ogn)

o(logn)

o(logn

), 因為n次冪運算可以在o(l

ogn)

o(logn)

o(logn

)執行完.

但是這個演算法無法實現,因為浮點數運算的精度問題.

recursive squaring[fi

bn+1

fibn

fibn

fibn

−1]=

[111

0]

n\left[ \begin fib_ & fib_ \\ fib_ & fib_ \end \right]= \left[ \begin 1 & 1 \\ 1 & 0 \end \right]^n

[fibn+

1​fi

bn​​

fibn

​fib

n−1​

​]=[

11​1

0​]n

演算法時間複雜度為o(l

og(n

))

o(log(n))

o(log(

n)).

%time fib(30)

cpu times: user 200 ms, sys: 3.94 ms, total: 204 ms

wall time: 208 ms

%time fib2(30)

cpu times: user 7 µs, sys: 0 ns, total: 7 µs

wall time: 10 µs

求斐波那契數列

一 用陣列求取斐波那契數列第n項的數值 非遞迴 斐波那契數列求取思想 第n項 第n 1項 第n 2項 function getvalue n var j 0 while j n 1 return arr j else alert getvalue 8 求第八項的值 二 使用遞迴求取第n項的值 fun...

斐波那契數列 斐波那契數列python實現

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...

迴圈斐波那契數列 斐波那契數列應用

什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...