C語言 斐波那契數列四種優化求解

2021-08-24 23:47:35 字數 2197 閱讀 8361

題目:

方法一:遞迴實現

//時間複雜度o(n^2)

//空間複雜度o(n)

缺點:①只是使用於n比較小的時候,否則效率低,因為會做很多次重複操作

②而且該例遞迴屬於多分支遞迴,容易造成棧溢位

方法二:非遞迴實現(迭代)

//時間複雜度o(n)

//空間複雜度o(1)

long

long

fib(size_t n)

return n3;

}

方法三:尾遞迴實現

//時間複雜度o(n)

優點:①計算結果參與到下一次的計算,從而減少很多重複計算量

②原本樸素的遞迴產生的棧的層次像二叉樹一樣,以指數級增長,但是現在棧的層次卻像是陣列,變成線性增長了,簡單來說,原本棧是先擴充套件開,然後邊收攏邊計算結果,現在卻變成在呼叫自身的同時通過引數來計算。

尾遞迴可以轉換成迭代演算法

總結

尾遞迴的本質是:將單次計算的結果快取起來,傳遞給下次呼叫,相當於自動累積

方法四:矩陣乘法實現 (最優解)

#include

//base 底數 ,exp 指數

intqpow

(int base,

int exp)

base=base*base;

exp>>=1;

//右移一位

}return ret;

}int

main()

:此方法借鑑與 谷歌面試題精選

#include

#include

using namespace std;

//定義2×2矩陣;

struct matrix2by2

//資料成員

long m00;

long m01;

long m10;

long m11;};

//定義2×2矩陣的乘法運算

matrix2by2 matrixmultiply

(const matrix2by2& matrix1,

const matrix2by2& matrix2)

//定義2×2矩陣的冪運算

matrix2by2 matrixpower

(unsigned

int n)

else

if(n %2==

0)else

if(n %2==

1)return matrix;

}//計算fibnacci的第n項

long

fibonacci

(unsigned

int n)

intmain()

結語:
努力的人生是完美的,因為不曾後悔過!!!

斐波那契數列求解的優化

題目 給定整數n,返回斐波那契數列的第n項。解法一 暴力遞迴,時間複雜度為o 2 n int fun int n else if n 1 n 2 return fun n 1 fun n 2 解法二 儲存前面求出的值,時間複雜度為o n int fun int n else if n 1 n 2 e...

斐波那契數列求解

斐波那契數列是一種常見的數列,其滿足下面兩個條件 f0 f1 1 fn fn 1 fn 2 斐波那契數列求解def fib1 n if n 2 return 1 return fib1 n 1 fib1 n 2 不適用遞迴 python def fib2 n f1 f2 1 for i in ran...

Matlab求解斐波那契數列

下面是乙個matlab的指令碼函式,用於求解菲波那切數列,而且可以判斷輸入是否符合實際情況 function fibona n 斐波那契數列,前兩項之和等於第三項 f n f n 1 f n 2 第一項和第二項分別都是1 f 1 1,f 2 1 程式主題 if n 3 disp n warning ...