演算法導論 31 3 關於斐波那契數的三個演算法

2021-06-27 04:54:30 字數 2088 閱讀 3159

31-3(關於斐波那契數的三個演算法) 在已知n的情況下,本題對計算第n個斐波那契數fn的三種演算法的效率進行了比較。假定兩個數的加法,減法和乘法的代價都是o(1),與數的大小無關。

a.證明:基於遞迴式(3.22)計算fn的直接遞迴方法的執行時間為n的冪。

b.試說明如何運用記憶法在o(n)時間內計算fn.

3.22: fibonacci numbers

we define the fibonacci numbers by the following recurrence:

f(0) = 0, f(1) = 1, f(i) = f(i-1) + f(i-2) for (i>=2).

/* 31-3 three algorithms for fibonacci numbers 3.22

3.22: fibonacci numbers

we define the fibonacci numbers by the following recurrence:

f(0) = 0, f(1) = 1, f(i) = f(i-1) + f(i-2) for (i>=2).

*/public class fibonaccinumbers

for(int i=0; i< 20; i++)

for(int i=0; i< 20; i++)

} // b. show how to compute f(n) in o(n) time using memoization o(n) space.

public static int fibona2(int n)

int result = new int[n+1];

result[0] = 0;

result[1] = 1;

for(int i=2; i<=n; i++)

return result[n];

} // b. show how to compute f(n) in o(n) time using o(1) space.

public static int fibona1(int n)

return fn;

} // c. show how to compute fn in o(lgn) time using only integer addition and multiplication.

// (hint: consider the matrix (0,1) and and its powers.) matrix[0][0] if fibona number

// (1,1)

// f(0)=a.00, f(1)=(a^2).00, f(n)=(a^(n+1)).00

public static fibonamatrix fibonabymatrixpower(int n)

fibonamatrix fibhalf = fibonabymatrixpower(n>>1);

fibonamatrix fib = fibonamatrix.multiply(fibhalf, fibhalf);

if((n & 1) == 1)

return fib;

} //f(n)為[0,1,1,1]^n+1的[0][0],這個可用數學歸納法證明, f(n)=(a^(n+1)).[0][0],

static class fibonamatrix

public static fibonamatrix multiply(fibonamatrix one, fibonamatrix another)

public int getfibonanb()

public static fibonamatrix getfibonamatrix()

}}

斐波那契數

入門訓練 fibonacci數列 時間限制 1.0s 記憶體限制 256.0mb 問題描述 fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,...

斐波那契數

斐波那契數列 fibonacci sequence 簡介 斐波那契數列 fibonacci sequence 又稱 分割 數列 因 數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 ...

斐波那契數

遞迴演算法是不可取的。由於效率非常低,並且還有棧溢位的風險。應該使用例如以下的迭代解法 int fibonacci unsigned int n if n 1 int i 0,j 1,m unsigned int k for k 2 k n k return m 可是對於這題來說。上面的 還是不行的...