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 可是對於這題來說。上面的 還是不行的...