第6章 ユーザー定義関数 / 第4回 模擬試験
次のコードの実行結果として正しいものはどれか。 ```php function fibonacci($n) { if ($n <= 1) { return $n; } return fibonacci($n - 1) + fibonacci($n - 2); } print fibonacci(6); ```
8
正解
13
6
5
解説
フィボナッチ数列は「直前の2つの項の和が次の項になる」数列で、`fibonacci(0)=0`, `fibonacci(1)=1`を基点に、`fibonacci(n) = fibonacci(n-1) + fibonacci(n-2)`という再帰的な定義で計算できます。
数列を並べると `0, 1, 1, 2, 3, 5, 8, 13, ...`(`fibonacci(0)`から順に)となり、`fibonacci(6)`は0番目から数えて6番目の値である`8`です。
例:
```
function fibonacci($n) {
if ($n <= 1) {
return $n;
}
return fibonacci($n - 1) + fibonacci($n - 2);
}
print fibonacci(6); // 8
```
この実装は「単純な再帰」のため、`$n`が大きくなると同じ計算を何度も繰り返してしまい非常に遅くなります(計算量が指数関数的に増加します)。実務では計算結果をキャッシュする「メモ化」や、ループを使った実装で高速化するのが一般的です。
(参照: 独習PHP 第4版 第6章 ユーザー定義関数 6.4.2節 再帰関数 p.290〜291)
関連する問題
- PHPの関数引数に関する次の記述のうち、誤っているものはどれか。
- 関数に関する次の記述のうち誤っているものはどれか。
- PHPの匿名関数とアロー関数に関する次の記述のうち、正しいものはどれか。
- 次のコードの実行結果として正しいものはどれか。 ```php $val = 'a'; $val = 'b'; print ('【A】' . $val); function func($val = 'c') { $val = 'd'; print ('【B】' . $val); global $val; print ('【C】' . $val); $val = 'e'; print ('【D】' . $val); $val = 'f'; } $val = 'g'; func($val); print ('【E】' . $val); ```
- PHPの変数のスコープに関する次の記述のうち、正しいものはどれか。