《劍指offer》第十題(斐波那契數列)

2022-09-07 23:12:23 字數 2443 閱讀 9364

//

面試題:斐波那契數列

//題目:寫乙個函式,輸入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 ...