PHPの再帰関数でフィボナッチ数列を計算しよう!初心者向けにやさしく解説
生徒
「先生、PHPでフィボナッチ数列を計算するにはどうしたらいいですか?」
先生
「PHPでは、再帰関数という仕組みを使って、フィボナッチ数列を計算できますよ。」
生徒
「再帰関数ってなんですか?難しそう…」
先生
「大丈夫です!図や例えを使ってわかりやすく説明しますね。では、PHPでの再帰関数とフィボナッチ数列の関係から見ていきましょう。」
1. フィボナッチ数列とは?まずは基本を確認
フィボナッチ数列(すうれつ)とは、「前の2つの数字を合計して、次の数字を作る」というシンプルなルールで並んだ数字の列のことです。イタリアの数学者レオナルド・フィボナッチにちなんで名付けられました。
具体的にどのような数字が並ぶのか、まずは最初の数個を見てみましょう。
0、1、1、2、3、5、8、13、21、34...
一見するとただの数字の羅列に見えますが、実は計算のルールはとても簡単です。プログラミング未経験の方でも、以下の図解を見ればすぐに理解できますよ。
- 3番目の数:1番目の「0」+ 2番目の「1」= 1
- 4番目の数:2番目の「1」+ 3番目の「1」= 2
- 5番目の数:3番目の「1」+ 4番目の「2」= 3
- 6番目の数:4番目の「2」+ 5番目の「3」= 5
このように、「直前の2つを足すと次の答えになる」という連鎖がどこまでも続いていくのが特徴です。この仕組みは、自然界のひまわりの種の並び方や、貝殻の渦巻きなどにも現れる不思議な法則として知られています。
プログラミングの世界では、この「自分より前のデータを使って計算する」という構造が、アルゴリズム(計算の手順)を学ぶための絶好の題材としてよく使われます。
2. PHPでフィボナッチ数列を計算するには?
数学的な法則であるフィボナッチ数列をPHPプログラムで再現するには、「関数(かんすう)」という仕組みを利用します。関数とは、特定の処理をひとまとめにして、いつでも呼び出せるようにした「命令のセット」のようなものです。
さらに、今回の最大のポイントは、同じ関数の中で自分自身を呼び出す「再帰関数(さいきかんすう)」という高度なテクニックを使う点にあります。
「自分の中で自分を呼び出す」と聞くと、無限ループになってしまいそうで少し怖く感じるかもしれません。しかし、プログラミング初心者の方でも理解しやすいように、まずは簡単な「カウントダウン」を例に、再帰のイメージを掴んでみましょう。
function countDown($num) {
// 終わりを決める(ベースケース)
if ($num <= 0) {
echo "スタート!";
return;
}
echo $num . "... ";
// 自分自身をもう一度呼び出す(再帰呼び出し)
countDown($num - 1);
}
countDown(3);
このサンプルでは、countDown(3)を呼ぶと、その中でcountDown(2)、さらにその中でcountDown(1)…というように、マトリョーシカ人形のように処理が重なっていきます。
再帰関数は、今回のような「前の数字を足し続ける」という繰り返しのルールを持つフィボナッチ数列の計算と非常に相性が良く、コードを驚くほどスッキリと短く書くことができる便利な書き方なのです。
3. PHPの再帰関数でフィボナッチ数列を作る
それでは、実際にPHPを使ってフィボナッチ数列を計算するプログラムを書いてみましょう。今回は「自分自身を呼び出す」という再帰関数のルールに則って、非常にシンプルなコードで作成します。
プログラミングが初めての方でも安心してください。以下のコードは、「前の2つの数字を足す」という数学のルールをそのままPHPの言葉に翻訳しただけのものです。
<?php
// フィボナッチ数列のn番目の数字を求める関数
function fibonacci($n) {
// 最初の数(0番目と1番目)は計算不要なので、そのまま数字を返す
if ($n === 0) {
return 0;
}
if ($n === 1) {
return 1;
}
// それ以外(2番目以降)は、「1つ前」と「2つ前」を足し合わせる(再帰呼び出し)
return fibonacci($n - 1) + fibonacci($n - 2);
}
// 例として、6番目の数字を表示してみる
echo fibonacci(6);
?>
このプログラムでは、fibonacciという名前の関数を定義しています。この関数は、知りたい順番($n)を教えてあげると、その位置にあるフィボナッチ数を計算して手渡してくれる(返す)役割を持っています。
例えば、fibonacci(6)と命令を出すと、関数の中で「5番目の数字」と「4番目の数字」をさらに計算しに行き、最終的な答えである「8」を導き出します。このように、複雑な計算を「小さな計算の積み重ね」に分解して記述できるのが、PHPにおける再帰関数の大きなメリットです。
一見すると難しそうですが、コードの行数が驚くほど短くまとまっている点に注目してください。これが、アルゴリズムをスマートに記述するためのプロのテクニックなのです。
4. プログラムのしくみをやさしく解説
このプログラムの中で行われていることを、順番に見てみましょう。
- $nが0の場合は0を返す
- $nが1の場合は1を返す
- それ以外のときは「
fibonacci($n - 1)+fibonacci($n - 2)」を返す
つまり、fibonacci(6)は
fibonacci(5) + fibonacci(4)を計算し、さらにその中でも再び関数が呼ばれるというように、どんどん分解していくのです。
5. 実行結果を確認しよう
上のPHPコードを実行すると、次のような結果が表示されます。
8
これは、フィボナッチ数列の6番目の数が「8」であることを示しています。
PHPでの再帰関数の動きを実際に見てみると、より理解が深まります。
6. 再帰関数はなぜ便利なの?
再帰関数の大きな特徴は、同じパターンの繰り返し処理をシンプルに書けることです。
たとえば、階段を登るときに「1段ずつ登る方法」と「2段飛ばして登る方法」があるとすると、「それぞれの方法の組み合わせ」を調べるのにも再帰関数が使えます。
こうした「分割して考える」問題には、とても相性が良いのです。
7. プログラミング初心者がつまずくポイントと対策
PHPの再帰関数を初めて学ぶときに、よくあるつまずきポイントは以下のようなものです。
- 関数の中で同じ関数を呼び出す仕組みがイメージしにくい
- 何回も関数が呼ばれるので、頭が混乱する
- 結果がなぜそうなるのかが見えづらい
対策としては、「紙に書いて流れを図にする」ことをおすすめします。
たとえばfibonacci(4)の流れを図にするとこうなります:
- fibonacci(4)
- fibonacci(3) + fibonacci(2)
- fibonacci(2) + fibonacci(1) + fibonacci(1) + fibonacci(0)
このように、「どの数字を使って計算されているか」を丁寧に追いかけていくと、理解がぐっと深まります。
8. 再帰関数とフィボナッチ数列の組み合わせを活かす練習
最後に、再帰関数を使ったフィボナッチ数列の応用例として「1〜10番目までの値をすべて表示する」プログラムを紹介します。
for ($i = 0; $i <= 10; $i++) {
echo fibonacci($i) . ", ";
}
このように、for文(ループ)と組み合わせることで、複数のフィボナッチ数を一気に表示できます。
まとめ
フィボナッチ数列は、プログラミング初心者が再帰関数を学ぶ題材として非常に適しています。なぜなら、「前の2つの値を足す」という明快なルールを、関数の中で繰り返して実現するからです。この記事では、PHPでの再帰関数の書き方や動作の仕組みを通して、数列の計算方法を丁寧に学んできました。 PHPにおける再帰関数は、自分自身を呼び出して処理を繰り返すという特徴があり、シンプルに見える記述で複雑な計算を実現できます。ただし、慣れないうちは何度も関数が呼び出される構造に戸惑うこともあります。そのため、目に見えるように「手書きで再帰の流れを図にする」ことが理解の近道になります。
PHPの再帰関数でフィボナッチ数列を出力する応用
たとえば、1〜10番目までのフィボナッチ数を一度に表示したい場合、ループ文を使って次のように組み合わせることができます。
function fibonacci($n) {
if ($n === 0) {
return 0;
} elseif ($n === 1) {
return 1;
} else {
return fibonacci($n - 1) + fibonacci($n - 2);
}
}
for ($i = 0; $i <= 10; $i++) {
echo fibonacci($i) . ", ";
}
実行すると「0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55,」と出力され、各インデックスに対応する値が正しく表示されることがわかります。 再帰関数の強みは、このように複雑な繰り返し処理を簡潔に表現できる点です。しかし、呼び出し回数が多くなると処理速度が遅くなる可能性があるため、大きな数値を扱うときには注意が必要です。 今後、階乗の計算や木構造の探索などでも再帰が使える場面が増えていくので、基本の考え方をしっかりと理解しておくことが大切です。
生徒
「再帰関数って、難しそうに見えてたけど、フィボナッチ数列みたいな規則のあるものだと考えやすいですね!」
先生
「そうですね。最初のうちは戸惑うかもしれませんが、再帰は同じ処理を何度も繰り返すようなときに、とても力を発揮しますよ。」
生徒
「最初はfibonacci(6)って呼び出してるのに、中でfibonacci(5)やfibonacci(4)がさらに何度も呼ばれるのを見て、すごく不思議でした。」
先生
「実際に計算の流れを図に描いてみると、ひとつひとつの再帰の動きがよく見えてきます。理解するには視覚化が効果的です。」
生徒
「for文と組み合わせて複数のフィボナッチ数を出すやり方もすごく便利ですね!配列みたいに扱えるのが新鮮でした。」
先生
「実は、もっと効率よく計算する方法もあるんですよ。メモ化再帰や動的計画法(DP)といったテクニックを使うと、処理速度が一気に上がります。興味が出たらぜひ調べてみてくださいね。」
生徒
「なるほど…再帰関数の入り口として、今日のフィボナッチ数列の勉強はすごく良い練習になりました!」
先生
「その調子です!再帰関数をしっかり理解しておくと、今後のアルゴリズム学習にも必ず役立ちますよ。」