題目:輸入乙個整數 ,求斐波那契數列的第 n項。(斐波那契數列每一項的值是其前兩項的和)
思路1:暴力法
思路2:記憶化搜尋
開乙個大陣列記錄中間結果,如果乙個狀態被計算過,則直接查表,否則再遞迴計算。
總共有 n 個狀態,計算每個狀態的複雜度是 o(1),所以時間複雜度是 o(n)。
思路3:遞推
開乙個大陣列,記錄每個數的值。用迴圈遞推計算。
總共計算 n 個狀態,所以時間複雜度是 o(n)。
開乙個大陣列記錄中間結果,如果乙個狀態被計算過,則直接查表,否則再遞迴計算。
總共有 n 個狀態,計算每個狀態的複雜度是 o(1),所以時間複雜度是 o(n)。
思路4:矩陣運算+快速冪
先利用矩陣運算的性質將通項公式變成冪次形式,然後用平方倍增(快速冪)的方法求解第 n 項。
首先定義 xn=[an,an-1] x1=[a1 a0]
a=[1 1
1 0]
則有xn=xn-1*a
xn=x1*a^(n-1)
xn向量的第乙個元素即為an
c++實現如下。
/*
題目:輸入乙個整數 ,求斐波那契數列的第 n項。(斐波那契數列每一項的值是其前兩項的和)
假定從0開始,第0項為0。(n<=39)
*/#include#includeusing namespace std;
//思路1:暴力法
class solution1
return a;
}};//思路2:記憶化搜尋
//開乙個大陣列記錄中間結果,如果乙個狀態被計算過,則直接查表,否則再遞迴計算。
//總共有 n 個狀態,計算每個狀態的複雜度是 o(1),所以時間複雜度是 o(n)。
class solution2
return a;
}};//思路3:遞推
//開乙個大陣列,記錄每個數的值。用迴圈遞推計算。
//總共計算 n 個狀態,所以時間複雜度是 o(n)。
//開乙個大陣列記錄中間結果,如果乙個狀態被計算過,則直接查表,否則再遞迴計算。
//總共有 n 個狀態,計算每個狀態的複雜度是 o(1),所以時間複雜度是 o(n)。
class solution3
return v[n];
}};//思路4:矩陣運算+快速冪
//先利用矩陣運算的性質將通項公式變成冪次形式,然後用平方倍增(快速冪)的方法求解第 n 項。
//首先定義 xn=[an,an-1] x1=[a1 a0]
//a=[1 1
// 1 0]
//則有xn=xn-1*a
//xn=x1*a^(n-1)
//xn向量的第乙個元素即為an
class solution4 , };
for (int i = 0; i < 2; i++)
}} for (int i = 0; i < 2; i++)
}} int fibonacci(int n) ;
int res[2][2] = , };//xn矩陣
int t[2][2] = , };//t為底數矩陣 n為冪數
long long k = n;
while (k)
int c[2] = ;
//與x1乘
for (int i = 0; i < 2; i++)
}return c[0];
}};void main()
10 1 斐波那契數列
nowcoder 求斐波那契數列的第 n 項,n 39。如果使用遞迴求解,會重複計算一些子問題。例如,計算 f 4 需要計算 f 3 和 f 2 計算 f 3 需要計算 f 2 和 f 1 可以看到 f 2 被重複計算了。遞迴是將乙個問題劃分成多個子問題求解,動態規劃也是如此,但是動態規劃會把子問題...
LeetCode 面試題10 1 斐波那契數列
原解答在這兒 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 f 0 0,f 1 1 f n f n 1 f n 2 其中 n 1.斐波那契數列由 0 和 1 開始,之後的斐波那契數就是由之前的兩數相加而得出。答案需要取模 1e9 7 10000000...
LeetCode 斐波那契查詢(Python版)
斐波那契數列 fibonacci 又稱 分割數列,指的是這樣乙個數列 1,1,2,3,5,8,13,21,在數學上,斐波那契被遞迴方法如下定義 f 1 1 f 2 1 f n f n 1 f n 2 n 2 該數列越往後,相鄰的兩個數的比值越趨於 比例值 0.618 斐波那契查詢就是在二分法查詢的基...