4 2 斐波拉契數列的計算方法

2021-09-23 14:23:39 字數 2014 閱讀 4197

輸入整數n,求斐波拉契數列第n個數。

利用f(n) = f(n-1) + f(n-2)的特性來進行遞迴,**如下:

**:

long long fib(unsigned int n)

缺陷:當n比較大時遞迴非常慢,因為遞迴過程中存在很多重複計算。

應該採用非遞迴演算法,儲存之前的計算結果,用空間換時間。

**如下:

#include#includeusing namespace std;

int main()

return 0;

}uint64 fibonacci(int n)

方法2:迭代法,通過儲存中間項避免重複計算,時間複雜度o(n);

#include #include int main(void)

if(n <= 0)

y = x;

printf("n = %d,fibonacci(n) = %d\n",n,y);

}

return 0;

}

方法3:公式法,時間複雜度o(1),因為公式中引入了無理數,所以不能保證結果的精度;#include#include#include

doublepow(doublex,unsignedintn);

intmain(void)

return0;

}

doublepow(doublex,unsignedintn)

returnresult;

}

方法4:分治策略,可以用矩陣來表示

則f2 = y2_11 = a(11表示矩陣的第1行1列元素).

現在剩下的問題就是求an了,可以把n用二進位制表示:n = ak*2^k + ak-1*2^k-1 + ... + a1*2 + a0,其中ai = 0 或1 ,i = 0,1,2... k。例如:n = 5 = b』101 = 1*22 + 0*21+1*20。這樣

則,我們知道an最多經過log2n乘法就能夠得到,而不用a*a*a這樣計算n次。

**實現:

#include #include const int maxlength = 10;

struct matrix

;// 方陣的乘法

void matrixmult(const matrix a, const matrix b, matrix &m)

return res.dat[0];

}int main(void)

return 0;

}

斐波拉契數列

斐波拉契數列 1 1 2 3 5 8 13 21 34.其中每乙個數字都是前兩個數字的和。遞迴計算 long fibonacci int n 非遞迴計算 long fibonacci int n return result 這個函式的遞迴實現使用了雙重遞迴 double recursion 函式對本...

斐波拉契數列

編寫彙編程序列印1 1000的斐波拉契數列 原始碼assume cs code,ss stack,ds data data segment fibo dw 0,1,64 dup 0 str db the fibo list is 0ah,0dh,data ends stack segment db ...

斐波拉契數列

斐波拉契數列 這個數列從第三項開始,每一項都等於前兩項之和。已知斐波拉契數列的前兩項都是1,我們定義求斐波拉契數列的第n項 n 50 的函式為fbnq,請補充完成對fbnq函式的定義。輸入格式 共一行,為乙個正整數。輸出格式 共一行,為乙個正整數。輸入樣例 7輸出樣例 13 斐波拉契數列 def f...