第6章 ユーザー定義関数 / 第3回 模擬試験
次のコードの実行結果として正しいものはどれか。 ```php function factorial($n) { if ($n <= 1) { return 1; } return $n * factorial($n - 1); } print factorial(5); ```
120
正解
20
15
5
解説
これは自分自身を呼び出す「再帰関数」による階乗の計算です。`factorial($n)`は`$n <= 1`になるまで`$n * factorial($n - 1)`を繰り返し計算します。
`factorial(5)`の呼び出しは次のように展開されます。
```
factorial(5) = 5 * factorial(4)
= 5 * 4 * factorial(3)
= 5 * 4 * 3 * factorial(2)
= 5 * 4 * 3 * 2 * factorial(1)
= 5 * 4 * 3 * 2 * 1
= 120
```
例:
```
function factorial($n) {
if ($n <= 1) {
return 1;
}
return $n * factorial($n - 1);
}
print factorial(5); // 120
```
再帰関数を書く際は、必ず`$n <= 1`のような「再帰を終わらせる条件(基底ケース)」を用意しないと、無限に呼び出しが続き`Fatal error`になる点に注意してください。
(参照: 独習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の変数のスコープに関する次の記述のうち、正しいものはどれか。