PHPの再帰関数でフィボナッチ数列を計算しよう!初心者向けにやさしく解説
生徒
「先生、PHPでフィボナッチ数列を計算するにはどうしたらいいですか?」
先生
「PHPでは、再帰関数という仕組みを使って、フィボナッチ数列を計算できますよ。」
生徒
「再帰関数ってなんですか?難しそう…」
先生
「大丈夫です!図や例えを使ってわかりやすく説明しますね。では、PHPでの再帰関数とフィボナッチ数列の関係から見ていきましょう。」
1. フィボナッチ数列とは?まずは基本を確認
フィボナッチ数列(すうれつ)とは、「前の2つの数を足して次の数を作る」規則でできた数の列です。
たとえば、次のように続きます:
0、1、1、2、3、5、8、13、21、34...
つまり、3番目の数は「1+0=1」、4番目は「1+1=2」、5番目は「2+1=3」というふうに計算されます。
2. PHPでフィボナッチ数列を計算するには?
このフィボナッチ数列をPHPで計算するには、「関数」を使います。
さらに、同じ関数の中で自分自身を呼び出す「再帰関数(さいきかんすう)」という方法が便利です。
再帰関数とは、自分自身の中でまた同じ関数を使う仕組みです。ちょっと不思議に聞こえるかもしれませんが、処理を繰り返すのにとても便利な書き方です。
3. PHPの再帰関数でフィボナッチ数列を作る
では、PHPで再帰関数を使ってフィボナッチ数列を計算するプログラムを見てみましょう。
function fibonacci($n) {
if ($n === 0) {
return 0;
} elseif ($n === 1) {
return 1;
} else {
return fibonacci($n - 1) + fibonacci($n - 2);
}
}
echo fibonacci(6);
このプログラムでは、fibonacciという関数が使われています。$nという数字を受け取って、
その位置のフィボナッチ数を返してくれます。
例としてfibonacci(6)を呼び出すと、6番目の値「8」が表示されます。
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)といったテクニックを使うと、処理速度が一気に上がります。興味が出たらぜひ調べてみてくださいね。」
生徒
「なるほど…再帰関数の入り口として、今日のフィボナッチ数列の勉強はすごく良い練習になりました!」
先生
「その調子です!再帰関数をしっかり理解しておくと、今後のアルゴリズム学習にも必ず役立ちますよ。」