再帰の限界(コールスタックサイズ)を超えたり超えなかったりする例
let 回数 = 0
// ルーレット: 0-36の数字に賭けて当たれば36倍
function ルーレット(総資金, 賭け金, 数字) {
if (総資金 < 賭け金 || 総資金 > 10000000) {
return
}
console.log(総資金 + '円', 回数++ + '回目')
const 当たり番号 = Math.floor(Math.random() * 37)
if (当たり番号 === 数字) {
return ルーレット(総資金 + 賭け金 * 36, 賭け金, 数字)
} else {
return ルーレット(総資金 - 賭け金, 賭け金, 数字)
}
}
// 100万円を元手に1000円ずつ、ずっと5に賭ける。
ルーレット(1000000, 1000, 5)
// 破産(正常終了)のときもあれば、途中でエラーのときも。
// RangeError: Maximum call stack size exceeded
// テストで発見できないかもしれない再帰の怖いエラー。