斐波那契數列指的是這樣一個數列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,... 這個數列從第3項開始,每一項都等於前兩項之和。由數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲“兔子數列”。典型的面試問題。
解法一: 遞歸解法
let fibnacci = n => n <= 0 ? 0 : n == 1 ? 1 : fibnacci( n - 2 ) + fibnacci( n - 1 );
但上述函數的複雜度是指數級的()
解法二: 迭代法(動態規劃的思想)
let fibnacci = n => {
if( n == 0 ){
return 0;
}
let a1 = 0, a2 = 1;
for( let i = 1; i < n; i ++ ) {
[a1, a2] = [a2, a1 + a2];
}
return a2;
}
上述解法的時間複雜度是O(n)
解法三: 用數學方法解答(通項公式)(存在浮點數,得使用Math.round實現整數轉換)
let fibnacci = n => (Math.pow((1 + Math.sqrt(5))/2, n) - Math.pow((1 - Math.sqrt(5))/2, n)) / Math.sqrt(5);
上述解法中因用了Math.pow(),冪次函數,所以時間複雜度是
解法四: 使用矩陣乘法來實現(暫未實現正確運行,後面再來看看原因,希望懂得大佬也給指點下)
let matrix22_mul = (x, y) => [
[x[0][0] * y[0][0] + x[0][1] * y[1][0], x[0][0] * y[0][1] + x[0][1] * y[1][1]],
[x[1][0] * y[0][0] + x[1][1] * y[1][0], x[1][0] * y[0][1] + x[1][1] * y[1][1]]
];
let matrix22_pow = (x, n) => {
let r = [[1, 0], [0, 1]];
let v = x;
while(n) {
if(n % 2 == 1) {
r = matrix22_mul(r, v);
n -= 1;
}
v = matrix22_mul(v, v);
n = n / 2;
}
return r;
}