Java言語のフィボナッチ数

Java Yan Yunofibonatchi Shu



フィボナッチ数は、ゼロから正の無限大までの正の (整数) 整数の特定のシーケンスです。現在のフィボナッチ数は、直前の 2 つのフィボナッチ数を加算することによって得られます。直前の 2 つのフィボナッチ数は単なる数字ではありません。

実際、最初の 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 つのフィボナッチ数を生成するには、次の数式を使用します。