はじめに
この実験では、Java で与えられた数がフィボナッチ数であるかどうかをチェックする方法を学びます。これを達成するための 3 つの異なるアプローチを探ります。
まず、指定された項数までのフィボナッチ数列を生成する方法を学びます。次に、生成された数列内に与えられた数が存在するかどうかをチェックするメソッドを実装します。最後に、数列全体を生成することなく数がフィボナッチ数であるかどうかを効率的に判断できる数式を利用して、チェックプロセスを最適化します。
フィボナッチ数列を生成する
このステップでは、特定の項数までのフィボナッチ数列を生成する Java プログラムを作成します。フィボナッチ数列は、通常 0 と 1 から始まり、各数がその前の 2 つの数の和になる数列です。数列は次のようになります:0, 1, 1, 2, 3, 5, 8, 13, 21, など。
新しい Java ファイルを作成し、この数列を生成するコードを記述します。
WebIDE が開いていない場合は開きます。デフォルトでは
~/projectディレクトリにいるはずです。そうでない場合は、下部のターミナルを開き、次のコマンドを入力します:cd ~/project~/projectディレクトリにFibonacci.javaという名前の新しいファイルを作成します。左側のファイルエクスプローラーで右クリックして「新しいファイル」を選択し、Fibonacci.javaと入力することで行えます。エディタで
Fibonacci.javaファイルを開き、次の Java コードをコピーして貼り付けます:import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter the number of terms for Fibonacci sequence: "); int n = scanner.nextInt(); if (n <= 0) { System.out.println("Please enter a positive integer."); } else if (n == 1) { System.out.println("Fibonacci sequence up to 1 term:"); System.out.println("0"); } else { System.out.println("Fibonacci sequence up to " + n + " terms:"); int firstTerm = 0; int secondTerm = 1; System.out.print(firstTerm + ", " + secondTerm); for (int i = 3; i <= n; ++i) { int nextTerm = firstTerm + secondTerm; System.out.print(", " + nextTerm); firstTerm = secondTerm; secondTerm = nextTerm; } System.out.println(); // Print a newline at the end } scanner.close(); } }このコードの主要部分をすばやく理解しましょう:
import java.util.Scanner;: ユーザー入力を読み取るためのScannerクラスをインポートします。public class Fibonacci:Fibonacciという名前のメインクラスを宣言します。public static void main(String[] args): プログラムの実行が開始されるメインメソッドです。Scanner scanner = new Scanner(System.in);: コンソールからの入力を読み取るためのScannerオブジェクトを作成します。System.out.print("Enter the number of terms... ");: ユーザーに項数の入力を促します。int n = scanner.nextInt();: ユーザーからの整数入力を読み取り、変数nに格納します。if-else if-elseブロックは、項数 (n) の異なるケースを処理します。int firstTerm = 0; int secondTerm = 1;: 数列の最初の 2 つの項を初期化します。System.out.print(firstTerm + ", " + secondTerm);: 最初の 2 つの項を出力します。forループは、それ以降の項を計算して出力します。int nextTerm = firstTerm + secondTerm;: 前の 2 つの項の和を計算して次の項を求めます。firstTerm = secondTerm; secondTerm = nextTerm;: 次の反復のためにfirstTermとsecondTermを更新します。scanner.close();:Scannerオブジェクトを閉じます。
Fibonacci.javaファイルを保存します (Ctrl+S または Cmd+S)。次に、ターミナルで
javacコマンドを使用して Java プログラムをコンパイルします:javac Fibonacci.javaエラーがなければ、このコマンドにより
~/projectディレクトリにFibonacci.classファイルが作成されます。最後に、
javaコマンドを使用してコンパイルされたプログラムを実行します:java Fibonacciプログラムは項数の入力を求めます。数値 (例:10) を入力し、Enter キーを押すと、フィボナッチ数列が表示されます。
Enter the number of terms for Fibonacci sequence: 10 Fibonacci sequence up to 10 terms: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
フィボナッチ数列を生成する Java プログラムを正常に作成、コンパイル、実行しました!
数が数列内に存在するかどうかをチェックする
このステップでは、生成されたフィボナッチ数列内に与えられた数が存在するかどうかをチェックするように Java プログラムを修正します。これには、数列の項を生成する際にユーザーの入力した数と比較するロジックを追加する必要があります。
WebIDE エディタで
Fibonacci.javaファイルを開きます。数列内に数が存在するかどうかをチェックするロジックを含むように
mainメソッドを修正します。既存のmainメソッドを次のコードに置き換えます:import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter the number of terms for Fibonacci sequence: "); int n = scanner.nextInt(); if (n <= 0) { System.out.println("Please enter a positive integer for the number of terms."); scanner.close(); return; // Exit the program } System.out.print("Enter the number to check if it exists in the sequence: "); int checkNum = scanner.nextInt(); System.out.println("Fibonacci sequence up to " + n + " terms:"); int firstTerm = 0; int secondTerm = 1; boolean found = false; // Check the first two terms if (checkNum == firstTerm) { found = true; } System.out.print(firstTerm); if (n > 1) { if (checkNum == secondTerm) { found = true; } System.out.print(", " + secondTerm); } // Generate and check subsequent terms for (int i = 3; i <= n; ++i) { int nextTerm = firstTerm + secondTerm; if (checkNum == nextTerm) { found = true; } System.out.print(", " + nextTerm); firstTerm = secondTerm; secondTerm = nextTerm; } System.out.println(); // Print a newline at the end if (found) { System.out.println(checkNum + " exists in the Fibonacci sequence."); } else { System.out.println(checkNum + " does not exist in the Fibonacci sequence."); } scanner.close(); } }変更点の詳細は次の通りです:
- ユーザーにチェックしたい数を入力するように促すプロンプトを追加しました (
System.out.print("Enter the number to check..."))。 - この数を新しい変数
checkNumに読み込みました (int checkNum = scanner.nextInt();)。 - ブール型の変数
foundをfalseで初期化しました。この変数は、数が数列内に見つかったかどうかを追跡します。 - ループの前に、
checkNumがfirstTermまたはsecondTermと等しいかどうかをチェックします。 forループ内で、nextTermを計算した後、checkNumがnextTermと等しいかどうかをチェックします。等しい場合は、foundをtrueに設定します。- ループが終了した後、
if-else文を使用して、found変数の値に基づいて数が見つかったかどうかを出力します。
- ユーザーにチェックしたい数を入力するように促すプロンプトを追加しました (
Fibonacci.javaファイルを保存します。ターミナルで修正したプログラムをコンパイルします:
javac Fibonacci.javaコンパイルしたプログラムを実行します:
java Fibonacciプログラムは現在、項数とチェックする数を求めます。
例 1 (数が存在する場合):
Enter the number of terms for Fibonacci sequence: 10 Enter the number to check if it exists in the sequence: 8 Fibonacci sequence up to 10 terms: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 8 exists in the Fibonacci sequence.例 2 (数が存在しない場合):
Enter the number of terms for Fibonacci sequence: 10 Enter the number to check if it exists in the sequence: 10 Fibonacci sequence up to 10 terms: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34 10 does not exist in the Fibonacci sequence.
生成されたフィボナッチ数列に数が含まれているかどうかをチェックするようにプログラムを正常に修正しました。
数学的公式で最適化する
前のステップでは、フィボナッチ数列を反復的に生成し、各項と比較することで数が存在するかどうかをチェックしました。非常に大きな数の場合、数列全体を生成するのは非効率的です。このステップでは、数列を生成せずに数がフィボナッチ数であるかどうかをチェックできるフィボナッチ数の数学的性質を探ります。
正の整数 x がフィボナッチ数であるための必要十分条件は、5*x^2 + 4 または 5*x^2 - 4 が平方数であることです。平方数とは、整数の 2 乗になる整数のことです(例えば、4 は 2*2 なので平方数です)。
この公式を使用して数がフィボナッチ数であるかどうかをチェックする新しい Java プログラムを作成します。
~/projectディレクトリにCheckFibonacci.javaという名前の新しいファイルを作成します。CheckFibonacci.javaを開き、次の Java コードをコピーして貼り付けます:import java.util.Scanner; public class CheckFibonacci { // Function to check if a number is a perfect square public static boolean isPerfectSquare(int n) { if (n < 0) { return false; } int sqrt = (int) Math.sqrt(n); return (sqrt * sqrt == n); } // Function to check if a number is a Fibonacci number public static boolean isFibonacci(int n) { // n is Fibonacci if 5*n^2 + 4 or 5*n^2 - 4 is a perfect square return isPerfectSquare(5 * n * n + 4) || isPerfectSquare(5 * n * n - 4); } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("Enter a number to check if it is a Fibonacci number: "); int num = scanner.nextInt(); if (isFibonacci(num)) { System.out.println(num + " is a Fibonacci number."); } else { System.out.println(num + " is not a Fibonacci number."); } scanner.close(); } }このコードの新しい部分を見てみましょう:
public static boolean isPerfectSquare(int n): これは、整数nを引数に取り、nが平方数であればtrueを返し、そうでなければfalseを返すヘルパー関数です。整数の平方根を計算し、それを 2 乗した結果が元の数と等しいかどうかをチェックします。public static boolean isFibonacci(int n): この関数は数学的公式を実装しています。5*n*n + 4と5*n*n - 4を計算し、isPerfectSquare関数を使用してどちらかの結果が平方数であるかどうかをチェックします。||演算子は「または」を意味します。mainメソッドは、ユーザーに数を入力するように促し、isFibonacci関数を呼び出し、結果を出力します。
CheckFibonacci.javaファイルを保存します。ターミナルで新しいプログラムをコンパイルします:
javac CheckFibonacci.javaコンパイルしたプログラムを実行します:
java CheckFibonacciプログラムは数を入力するように求めます。数(例えば、13)を入力し、Enter キーを押します。
例 1(フィボナッチ数の場合):
Enter a number to check if it is a Fibonacci number: 13 13 is a Fibonacci number.例 2(フィボナッチ数ではない場合):
Enter a number to check if it is a Fibonacci number: 10 10 is not a Fibonacci number.
この方法は、数列をその数まで生成するよりも、単一の大きな数がフィボナッチ数であるかどうかをチェックするのにはるかに効率的です。
まとめ
この実験では、Java で数がフィボナッチ数であるかどうかをチェックする方法を学びました。まず、単純な反復アプローチを使用して、ある項数までのフィボナッチ数列を生成しました。これには、フィボナッチ数列の定義を理解し、項を計算して出力するロジックを実装することが含まれていました。
次に、生成されたフィボナッチ数列内に与えられた数が存在するかどうかをチェックする方法を探りました。最後に、数列全体を明示的に生成せずに数がフィボナッチ数であるかどうかを効率的に判断するための数学的公式を用いた最適化アプローチについて学びました。これには、フィボナッチ数の性質を理解し、チェックを行うために公式を適用することが含まれていました。



