1. 原則
黄金分割数列とも呼ばれるフィボナッチ数列 (フィボナッチ数列) は、数学者レオナルド フィボナッチ (Leonardo Fibonacci) がウサギの飼育を例として紹介したため、「ウサギ数列」とも呼ばれます。1、1、2、3、5、8、13、21、34……
数学的には、このシーケンスは次の再帰的方法によって定義されますF(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
。
2. コードの実装
n
フィボナッチ数列の数を計算するには、次の再帰関数を使用できます。
public class MyClass {
public static void main(String[] args){
int n = 10;
System.out.println("斐波那契数列第 " + n + " 个数为 " + Fibonacci(n));
}
//递归 n代表第几个数
public static int Fibonacci(int n) {
//前两个数为 1
//第三个数及后面的数为前面两数之和
//如果输入的 n 不合法将返回 -1
if (n == 1 || n == 2) {
return 1;
} else if (n > 2) {
return Fibonacci(n - 1) + Fibonacci(n - 2);
} else {
return -1;
}
}
}
時間計算量:
- 最良の場合、 がor
n
に等しい場合、直接戻り、時間計算量は になります。1
2
1
O(1)
- 最悪の場合、 が
n
より大きい場合、最初の 2 つの数値の合計を計算するために2
関数を再帰的に呼び出す必要があり、時間計算量は になります。各再帰呼び出しは 2 つの副問題を生成するため、各副問題は 2 つのより小さな副問題を生成し、再帰がまたはに達するまで同様に続きます。Fibonacci()
O(2^n)
n
1
2
O(2^n)
各数値は再帰呼び出しを通じて計算する必要があるため、平均して時間計算量も同様です。
空間の複雑さ:
- 再帰呼び出しではローカル変数と各呼び出しの戻りアドレスがスタックに保存されるため、空間の複雑さは再帰の深さに依存します。最悪の場合、再帰の深さは である
n
ため、空間複雑さは ですO(n)
。
要約すると、再帰的に実装されたフィボナッチ数列関数の時間計算量は指数関数的でありO(2^n)
、空間計算量は線形ですO(n)
。指数関数的な時間の複雑さのため、より大きなフィボナッチ数を計算する場合、再帰的実装は非常に遅くなります。
3. 走行結果
斐波那契数列第 10 个数为 55