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+
1fi
bn
fibn
fib
n−1
]=[
111
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級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...