//第三種想法思路:面試題:斐波那契數列
//題目:寫乙個函式,輸入n,求斐波那契(fibonacci)數列的第n項。
#include
using
namespace
std;
//********************方法1:遞迴********************
//注意這種遞迴方法雖然看起來很簡單,但是由於壓入棧和彈出,會存在棧溢位的可能,而且效率特別慢,且n越大效率越慢
long
long fibonacci_solution1(unsigned int n)//
注意long long
//********************方法2:迴圈********************
//這是一種簡單的方法,時間複雜度o(n),值得提倡
long
long
fibonacci_solution2(unsigned n)
;//注意頭兩個數我們無法計算,直接給出
if (n < 2
)
return
result[n];
long
long fibnminusone = 1
;
long
long fibnminustwo = 0
;
long
long fibn = 0
;
for (unsigned int i = 2; i <= n; ++i)
return
fibn;}//
********************方法3:基於矩陣乘法********************
//不常見但是時間複雜度更低: o(logn)
struct
matrix2by2
//matrix2by2(long long m00 = 0, long long m01 = 0, long long m10 = 0, long long m11 = 0) :m_00(m00), m_01(m01), m_10(m10), m_11(m11) {}
//也可以寫成上面這個形式,都是含參具有預設值的建構函式,是引數列表外初始化
long
long
m_00;
long
long
m_01;
long
long
m_10;
long
long
m_11;
};matrix2by2 matrixmultiply(
const matrix2by2& matrix1,const matrix2by2& matrix2)//
矩陣乘法
matrix2by2 matrixpower(unsigned
intn)
else
if (n % 2 == 0)//
第二種情況:n為偶數,遞迴求a^(n/2),然後乘回來
else
if (n % 2 == 1)//
第三種情況:n為奇數數,用第二種情況遞迴求a^((n-1)/2),然後乘回來後,再乘一次(1, 1, 1, 0)
return
matrix;
}long
long fibonacci_solution3(unsigned int
n);//
注意頭兩個數我們無法計算,直接給出
if (n < 2
)
return
result[n];
matrix2by2 powernminus2 = matrixpower(n - 1
);
return
powernminus2.m_00;}//
********************測試**********************
void test(int n, int
expected)
int main(int argc, char*ar**)
斐波那契數列擴充套件:
第十題 斐波那契數列
大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 難度 關鍵 不能用遞迴,時間複雜度會以n的指數方式增長,導致stackoverflow。要用迴圈,為了計算量不大,要自下而上的迴圈,將運算結果存在中間變數中,這樣就是o n 以一定的空間代價...
劍指offer刷題 斐波那契數列
題目一 寫乙個函式,輸入n,求斐波那契數列的第n項。對於題目一,接觸過遞迴人可能首先想到的就是通過遞迴的方法解決問題,例如計算第10項的斐波那契數列首先來看一下遞迴解決問題的思路,主要如下圖所示 我們可以發現,採用這種方式,做了很多的重複工作,例如f 8 就計算了兩次,第n是乙個非常大的數時,這耗費...
劍指offer 斐波那契數列
題目1描述 寫乙個函式,輸入n,求斐波那契數列的第n項。斐波那契數列的定義如下 f n 0 n 0 f n 1 n 1 f n f n 1 f n 2 n 1 分析描述 在大多數的c語言教科書中,一般會用遞迴求斐波那契數列。如下 long long fibonacci unsigned int n ...