給定正整數n, 求解fibonacci數列第n項的值;
給定正整數n, 代表台階, 一次可以跨2個或者1個台階, 有多少走法
假設成熟的母牛只會生1頭小母牛, 並且永遠不會死, 第一年農場有1只成熟的母牛,從第二年開始, 母牛開始生小母牛. 每只小母牛3年之後成熟. 給定正整數n, 求出n年後牛的數量.
遞迴的解法是最基礎, 也是最好理解, 但是時間複雜度很高, 為 o(
2n) ,空間複雜度為o(2^n)
public
static
intfibrecursion(int n)
if (n == 1)
return fibrecursion(n - 1) + fibrecursion(n - 2);
}
迭代的解法即將已經解決的位置處的數儲存, 之後直接呼叫, 不用再計算
時間複雜度為o(n), 空間複雜度為o(n).
public
static
intfibiteration(int n)
if (n == 0)
int arr = new
int[n + 1];
arr[0] = 0;
arr[1] = 1;
for (int i = 2; i < n + 1; i++)
return arr[n];
}
僅記錄前兩個值, 空間複雜度為o(1)
public
static biginteger fibiteration(int n)
if (n == 0)
biginteger res = new biginteger("0");
biginteger pre_1 = biginteger.valueof(1);
biginteger pre_2 = biginteger.valueof(0);
for (int i = 2; i < n + 1; i++)
return res;
}
f(
n)=f
(n−1
)+f(
n−2)
⇒∣∣f
(n)f
(n−1
)∣∣=
∣∣f(
n)f(
n−1)
∣∣×∣
∣∣∣a
cbd∣
∣∣∣
解得:a=1
b=1c
=1d=
1 即: ∣∣f
(n)f
(n−1
)∣∣=
∣∣f(
n−1)
f(n−
2)∣∣
×∣∣∣
∣111
0∣∣∣
∣⇒∣∣
f(n)
f(n−
1)∣∣
=|11
|×∣∣
∣∣11
10∣∣
∣∣n−
2
public
static biginteger fibmatrix(int n)
if (biginteger.one.compareto(biginteger.valueof(n)) == 0)
return matrixpower(new
int, }, n)[0][0];
}//計算矩陣matrix的p次方
public
static biginteger matrixpower(int matrix, int p) throws illegalargumentexception
biginteger res = new biginteger[matrix.length][matrix.length];
for (int i = 0; i < res.length; i++)
}for (int i = 0; i < res.length; i++)
biginteger tmp = new biginteger[matrix.length][matrix.length];
for (int i = 0; i < tmp.length; i++)
}while (p > 0)
tmp = multimatrix(tmp, tmp);
p = p >> 1;
}return multimatrix(new biginteger}, res);
}//矩陣乘法
public
static biginteger multimatrix(biginteger m1, biginteger m2) throws illegalargumentexception
biginteger res = new biginteger[m1.length][m2[0].length];
for (int i = 0; i < m1.length; i++)
}for (int i = 0; i < m1.length; i++) }}
return res;
}
當n=45時, 遞迴的方法就需要6794ms才能完成.
當n=1000000時, 迭代的方法耗時16s左右, 使用矩陣的方法只需耗時1.266s即完成
演算法 Fibonacci(斐波那契數列)相關問題
一 列出fibonacci數列的前n個數 using system using system.collections.generic using system.linq using system.text namespace fibonacci 需求 列出fibonacci數列的前n個數 方案一 迭...
Fibonacci數列(動態規劃相關)
問題描述 fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,包含乙個整數,表示fn除以10007的餘數。樣例輸入 10樣例輸出 55樣例輸入 ...
藍橋杯Fibonacci數列的遞推公式問題
fibonacci數列的遞推公式為 fn fn 1 fn 2,其中f1 f2 1。當n比較大時,fn也非常大,現在我們想知道,fn除以10007的餘數是多少。輸入格式 輸入包含乙個整數n。輸出格式 輸出一行,包含乙個整數,表示fn除以10007的餘數。說明 在本題中,答案是要求fn除以10007的餘...