はじめに
この実験では、Java で与えられた数がフィボナッチ数であるかどうかをチェックする方法を学びます。これを達成するための 3 つの異なるアプローチを探ります。
まず、指定された項数までのフィボナッチ数列を生成する方法を学びます。次に、生成された数列内に与えられた数が存在するかどうかをチェックするメソッドを実装します。最後に、数列全体を生成することなく数がフィボナッチ数であるかどうかを効率的に判断できる数式を利用して、チェックプロセスを最適化します。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
この実験では、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 で数がフィボナッチ数であるかどうかをチェックする方法を学びました。まず、単純な反復アプローチを使用して、ある項数までのフィボナッチ数列を生成しました。これには、フィボナッチ数列の定義を理解し、項を計算して出力するロジックを実装することが含まれていました。
次に、生成されたフィボナッチ数列内に与えられた数が存在するかどうかをチェックする方法を探りました。最後に、数列全体を明示的に生成せずに数がフィボナッチ数であるかどうかを効率的に判断するための数学的公式を用いた最適化アプローチについて学びました。これには、フィボナッチ数の性質を理解し、チェックを行うために公式を適用することが含まれていました。