フィボナッチ数列
ゴールデンセクションシーケンスとしても知られるフィボナッチシーケンス(フィボナッチシーケンス)は、ウサギの繁殖の例としてファクタナレオナルドダフィボナッチによって導入されたため、「ウサギシーケンス」とも呼ばれます。そのようなシーケンスです:1、1、2、3、5、8、13、21、34、...数学的には、フィボナッチ数列は次のように再帰的に定義されます:F(1)= 1、F(2)= 1、F(n)= F(n-1)+ F(n-2)(n≥3、n∈N *)
Java実装
forループ
この方法はスペースの無駄です
static int getFibonacci(int n) {
if (n <= 0) throw new IllegalArgumentException("参数错误");
int[] f = new int[n + 2]; // 为了少加个判断,多开两个空间
f[1] = 1;
f[2] = 1;
for (int i = 3; i <= n; i++) {
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
ループ改善のため
スペースを再利用
static int getFibonacci(int n){
if (n <= 0) throw new IllegalArgumentException("参数错误");
int a = 1, b = 1;
int sum = 1;
if (n == 1 || n == 2) return sum;
for (int i = 3; i <= n; i++) {
sum = a + b;
a = b;
b = sum;
}
return sum;
}
再帰バージョン
この再帰バージョンは考えるのが最も簡単ですが、スタックをポップするのは簡単です。
static int getFibonacci(int n) {
if(n == 1 || n == 2)
return 1;
return Fibonacci(n-1) + Fibonacci(n-2);
}
テール再帰
// 线性增长
static int getFibonacci(int n,int first,int second) {
if(n == 1) return first;
if(n == 2) return second;
return Fibonacci(n - 1, second, first + second);
}
関連する問題
Fnをrで割った余りは何ですか?アイデア:Fn%r =(Fn-1 + Fn-2)%r最初に剰余を取り、次に合計する
正の整数の階乗計算はフィボナッチのそれと同じです。