Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaでフィボナッチ数列を計算する方法:反復処理と再帰処理の2つのアルゴリズム解説

Javaでフィボナッチ数列を計算する方法:初心者向けガイド

フィボナッチ数列とは、「直前の2つの数を足し合わせることで次の数が求められる」数列のことです。

この数列は数学の世界で有名なだけでなく、自然界にも数多く見られます。例えば、多くの花の花びらは、フィボナッチ数列と同じ規則性に従って配置されていることで知られています。

本記事では、Javaを使ってフィボナッチ数列を計算する方法を解説します。「反復処理(ループ)」と「再帰処理」の2つのアルゴリズムを、サンプルコードとともにわかりやすく紹介します。

フィボナッチ数列とは?

フィボナッチ数列は、高校の数学で学んだことがある方も多いのではないでしょうか。

数列の最初の数は0と1です。それ以降の数は、直前の2つの数を足し合わせることで求められます。実際に数列を並べてみると、次のようになります。

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55

この数列は、計算したい項数に応じて無限に続けることができます。

フィボナッチ数列をプログラムで実装する方法は、主に次の2つがあります。

  • 反復関数(イテレーション)を使う方法
  • 再帰アルゴリズムを使う方法

以降では、それぞれのアプローチについて詳しく見ていきましょう。

反復処理によるフィボナッチ数列のJavaプログラム

まずは反復処理による実装から始めましょう。反復型プログラミングとは、for文などのループを使ってリストを順番に処理していく手法のことです。

反復処理を活用すれば、繰り返しの作業を自動化できます。フィボナッチ数列には「次の数の計算方法」という明確な公式があるため、反復処理との相性は抜群です。

まずは、クラスとメソッドを宣言し、プログラムで使用する3つの変数を定義しましょう。

public class FibonacciSequence {
	public static void main(String[] args) {
		int number = 5, firstTerm = 0, secondTerm = 1;
	}
}

変数「number」は、何項目まで計算するかを管理します。「firstTerm」と「secondTerm」には、それぞれ数列の最初の値と2番目の値が格納されます。プログラムの後半では、これらの変数は「直前に計算した2つの値」を保持する役割に変わります。

次に、数列の次のフィボナッチ数を計算するforループを書いてみましょう。

for (int i = 0; i < number; ++i) {
	System.out.println(firstTerm);

	int nextNumber = firstTerm + secondTerm;
	firstTerm = secondTerm;
	secondTerm = nextNumber;
}

このループでは、まずfirstTermの値を出力します。最初の繰り返しでは、この値は0です。その後、firstTermとsecondTermを足し合わせて次の数を計算します。

続いて、firstTermにsecondTermの値を代入し、secondTermには新しく計算したnextNumberを代入します。こうすることで、常に「直前の2つの値」を保持できる仕組みになります。

コードを実行すると、結果は以下のようになります。

0
1
1
2
3

数列の最初の5つの値が正しく計算されました。

再帰処理によるフィボナッチ数列のJavaプログラム

フィボナッチ数列は、再帰的なアルゴリズムでも計算できます。再帰とは、関数が自分自身を呼び出すことで問題を解決する手法のことです。フィボナッチ数列には一貫した計算式があるため、再帰処理を適用することができます。

まずはクラスを初期化しましょう。

class FibonacciSequence {
}

次に、再帰を使って数列の次の値を計算するメソッドを作成します。

static void getNextValue(int number, int firstTerm, int secondTerm) {
	if (number > 0) {
		System.out.println(firstTerm);

		int nextNumber = firstTerm + secondTerm;
		firstTerm = secondTerm;
		secondTerm = nextNumber;
		getNextValue(number - 1, firstTerm, secondTerm);
	}
}

このメソッドでは、firstTermとsecondTermを足し合わせて次の値を計算します。この処理は、変数「number」が0より大きい間だけ繰り返されます。「number」は、まだ計算が必要な残りの項数を表しています。

次の値が計算されると、getNextValue()メソッドが再帰的に呼び出されます。その際、「number」の値は1ずつ減らされます。これは、関数が実行されるたびに新しい数が1つ計算されるためです。

最後に、再帰関数を使用し、必要な変数を宣言するmainメソッドを書きましょう。

public static void main(String args[]) {
	int number = 5, firstTerm = 0, secondTerm = 1;
	getNextValue(number, firstTerm, secondTerm);
}

「number」は計算したい値の個数、firstTermは数列の最初の項、secondTermは2番目の項を表します。

getNextValueメソッドを呼び出すと、計算が開始されます。コードを実行して、フィボナッチ数を表示してみましょう。

0
1
1
2
3

フィボナッチ数列の最初の5つの値が計算できました!

まとめ

フィボナッチ数列は、数学やコンピュータサイエンス、そして自然界のあらゆる場所で見られる数列です。次の数は「直前の2つの数を足し合わせる」ことで求められ、数列は0と1から始まります。

この数列は、反復処理と再帰処理のどちらのアプローチでも計算可能です。この記事を参考に、ぜひJavaでのフィボナッチ数列の計算に挑戦してみてください。

  1. Javaコンパイラ入門:仕組みの解説と初心者におすすめのオンラインIDE

    5〜10年前、Javaを学ぶのは今ほど手軽なことではありませんでした。当時は、コンパイラとインタプリタを含むJava Development Kit(JDK)をダウンロードし、自分のマシン上で実行環境を整える必要がありました。しかし現在では、無料で利用できるJavaコンパイラがオンライン上に数多く存在します。この記事では、Java言語のコンパイルの仕組みと、練習やプロジェクト作成に活用できるオンラインツールについて詳しく解説します。 Javaプログラムはどのように実行されるのか? Javaは完全なコンパイル型言語ではありません。しかし、かといって完全なインタプリタ型言語でもありません。 ここ

  2. Javaで学ぶメモ化(1次元・2次元・3次元)動的計画法の基礎と実装

    メモ化(Memoization)は動的計画法に基づく技法の一つで、同じ入力に対して同じ計算を二度以上実行しないようにすることで、再帰アルゴリズムの性能を向上させるためのものです。具体的には、引数ごとの計算結果を配列などのキャッシュに記録しておき、同じ入力で再度呼び出された際には保存済みの結果を即座に返します。メモ化は、再帰メソッドをトップダウン方式で実装することで実現できます。ここでは、基本的なフィボナッチ数列の例を通じて、この仕組みを順を追って理解していきましょう。1次元(1-D)メモ化値が変化する非定数のパラメータが1つだけの再帰アルゴリズムにメモ化を適用する場合、これを1次元(1-D)メ