実際、最初の 2 つのフィボナッチ数は事前定義されています。最初のフィボナッチ数は 0 で、2 番目のフィボナッチ数は 1 です。0 から始まるインデックスを使用し、フィボナッチ数が配列内にあると仮定すると、次のようになります。
索引で 0 、フィボナッチ数は 0 、 ( 定義済み ) ;索引で 1 、フィボナッチ数は 1 、 ( 定義済み ) ;
索引で 2 、フィボナッチ数は 1 = 1 + 0 、 ( 定義により ) ;
索引で 3 、フィボナッチ数は 2 = 1 + 1 、 ( 定義により ) ;
索引で 4 、フィボナッチ数は 3 = 2 + 1 、 ( 定義により ) ;
索引で 5 、フィボナッチ数は 5 = 3 + 2 、 ( 定義により ) ;
索引で 6 、フィボナッチ数は 8 = 5 + 3 、 ( 定義により ) ;
索引で 7 、フィボナッチ数は 13 = 8 + 5 、 ( 定義により ) ;
索引で 8 、フィボナッチ数は 21 = 13 + 8 、 ( 定義により ) ;
索引で 9 、フィボナッチ数は 3.4 = 21 + 13 、 ( 定義により ) ;
等々。
プログラミングでは、これらのフィボナッチ数の 0 から始まるインデックスには、i ではなく変数 n が使用されます。そして、最初の 12 個のフィボナッチ数は次のとおりです。
0 | 1 | 1 | 2 | 3 | 5 | 8 | 13 | 21 | 3.4 | 55 | 89 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 十一 |
表の 2 行目はゼロから始まるインデックスを示しており、プログラミングではそれぞれに変数 n が含まれます。最初の行は、対応するフィボナッチ数を示します。つまり、フィボナッチ数はただの数ではありません。コア定義は、最初のフィボナッチ数の場合は 0 で始まり、2 番目のフィボナッチ数の場合は 1 で始まります。残りの数字はそこから生成されます。
フィボナッチ数は O(n) 時間と O(1) 時間で生成できます。 O(n) 時間の場合、たとえば n が 12 の場合、最初の 12 個のフィボナッチ数が生成されます。 O(1) 時間の場合、生成されるフィボナッチ数は 1 つだけです。たとえば、n が 6 の場合、フィボナッチ数 8 が生成されます。
この記事では、Java でフィボナッチ数を生成する 2 つの方法について説明します。
フィボナッチ数の公式
フィボナッチ数には数式があります。この式は、3 行または 1 行で記述できます。 3行で、次のように書かれています。
ここで F n ゼロ ベース n でのフィボナッチ数 番目 索引。これがフィボナッチ数の定義方法です。
O(n) 時間でフィボナッチ数を生成する
フィボナッチ数を O(3) 回で生成する場合、0、1、1 という数字が生成されます。これらは最初の 3 つのフィボナッチ数です。ゼロから始まる最後の n 番目 ここでの index は 2 です。フィボナッチ数が O(7) 回生成される場合、0、1、1、2、3、5、8 の数が生成されます。これらは最初の 7 つのフィボナッチ数です。ゼロから始まる最後の n 番目 ここでの index は 6 です。フィボナッチ数を O(n) 回生成する場合、0、1、1、2、3、5、8 – – – の数が生成されます。これらは最初の n 個のフィボナッチ数です。ゼロから始まる最後の n 番目 ここでのインデックスは n-1 です。
最初の n 個のフィボナッチ数を生成するクラスの Java メソッドは次のとおりです。
クラス フィボナッチ {空所 フィボナッチ ( 整数 [ ] P ) {
整数 n = P. 長さ ;
もしも ( n > 0 )
P [ 0 ] = 0 ;
もしも ( n > 1 )
P [ 1 ] = 1 ;
為に ( 整数 私 = 2 ; 私 < n ; 私 ++ ) { //n=0 と n=2 が考慮されています
整数 通貨番号 = P [ 私 - 1 ] + P [ 私 - 2 ] ;
P [ 私 ] = 通貨番号 ;
}
}
}
クラス、フィボナッチは非公開です。の フィボナッチ() メソッドは配列 P を取り、void を返します。メソッドは、配列の長さを決定することから始めます。この n の長さは、必要なフィボナッチ数の数です。 1 番目と 2 番目のフィボナッチ数は明示的に決定され、配列の 1 番目と 2 番目の位置に配置されます。
3 番目 (インデックス、n = 2) から始まる残りのフィボナッチ数は、for ループで決定され、配列内の位置に配置されます。したがって、関数は void を返す必要があります。 for ループのプリンシパル ステートメントは、前の 2 つの数値を加算します。
わかりやすくするために、n の代わりにインデックス変数 i が使用されています。
適切な Java Main クラス (Java main メソッドを使用) は次のとおりです。
公衆 クラス 主要 {公衆 静的 空所 主要 ( 弦 引数 [ ] ) {
整数 メートル = 12 ;
整数 [ ] 到着 = 新着 整数 [ メートル ] ;
フィボナッチ obj = 新着 フィボナッチ ( ) ;
オブジェクト。 フィボナッチ ( 到着 ) ;
為に ( 整数 私 = 0 ; 私 < メートル ; 私 ++ )
システム . アウト . 印刷する ( 到着 [ 私 ] + ' ' ) ;
システム . アウト . println ( ) ;
}
}
fibonacci() メソッドによって数値が生成された後、Java のメイン メソッドが数値を読み取ります。
一定時間で 1 つのフィボナッチ数を生成する
対応するゼロベースのインデックス n を指定すると、フィボナッチ数を生成するために使用できる数式があります。式は次のとおりです。
ここで、n はゼロベースのインデックスで、Fib は n 対応するフィボナッチ数です。式の右辺では、5 の平方根を n 乗したものではないことに注意してください。 n 乗されるのは、括弧内の式です。このような表現が 2 つあります。
n が 0 の場合、Fib n n が 1 の場合、Fib n n が 2 の場合、Fib n n が 3 の場合、Fib n n が 4 の場合、Fib n 3 などです。読者は、n に異なる値を代入して評価することにより、この式を数学的に検証できます。
コード化すると、この式は n に対して 1 つのフィボナッチ数のみを生成します。複数のフィボナッチ数が必要な場合は、式のコードを、対応する異なるインデックスごとに 1 回呼び出す必要があります。
Java では、フィボナッチ数を 1 つだけ生成する方法は次のとおりです。
輸入 java.lang.* ;クラス フィブ {
ダブル fib番号 ( 整数 n ) {
ダブル FibN = ( 算数 . 捕虜 ( ( 1 + 算数 . 平方根 ( 5 ) ) / 2 、n ) – 算数 . 捕虜 ( ( 1 - 算数 . 平方根 ( 5 ) ) / 2 、n ) ) / 算数 . 平方根 ( 5 ) ;
戻る FibN ;
}
}
java.lang.* パッケージは、プログラムの開始時にインポートする必要がありました。これは、パッケージにべき乗 (pow) メソッドと平方根 (sqrt) メソッドを持つ Math クラスがあるためです。ここでのカスタム Java メソッドは、数式を直接実装します。
この関数の時間計算量は O(1) であり、1 つの主要操作の定数です。上記のメソッドの Java メイン メソッドを持つ適切な Java メイン クラスは次のとおりです。
公衆 クラス 主要 {公衆 静的 空所 主要 ( 弦 引数 [ ] ) {
整数 N = 十一 ;
FIBオブジェクト = 新着 フィブ ( ) ;
ダブル 右 = オブジェクト。 fib番号 ( N ) ;
システム . アウト . println ( 右 ) ;
}
}
インデックス n = 11 が送信され、フィボナッチ数 89 が返されます。出力は次のとおりです。
89.00000000000003不要な 10 進数は削除できますが、それについては別の機会に説明します。
結論
フィボナッチ数は、整数の特定のシーケンスです。現在の番号を取得するには、直前の 2 つの対応する番号を加算します。最初の 2 つのフィボナッチ数 (0 の後に 1 が続く) は、シーケンス全体に対して事前に宣言されています。残りのフィボナッチ数はそこから生成されます。
インデックス 2 からインデックス n-1 に対応するフィボナッチ数を生成するには、プリンシパル ステートメントで for ループを使用します。
整数 通貨番号 = P [ 私 - 1 ] + P [ 私 - 2 ] ;ここで、currNo は現在のフィボナッチ数で、P は n 個の数値を格納する配列です。
ゼロベースのインデックス n から 1 つのフィボナッチ数を生成するには、次の数式を使用します。