Mais conteúdo relacionado
goで末尾再帰最適化は使えるか?
- 2. 階乗
6! = 6 * 5 * 4 * 3 * 2 * 1 = 720
5! = 5 * 4 * 3 * 2 * 1 = 120
4! = 4 * 3 * 2 * 1 = 24
3! = 3 * 2 * 1 = 6
2! = 2 * 1 = 2
1! = 1 = 1
末尾再帰最適化
- 5. 末尾再帰の場合
fact (4, 5)
コールスタック
fact(3, 20)
fact(2, 60)
fact(1, 120)
fact(0, 120)
return 120
return 120
return 120
return 120
func fact (5, 1)
return 120
n = 5 - 1 = 4
result = 5 * 1 = 5
n = 4 - 1 = 3
result = 5 * 4 = 20
n = 3 - 1 = 2
result = 20 *3 = 60
n = 2 - 1 = 1
result = 60 * 2 = 120
n = 1 - 1 = 0
result = 120
- 7. 末尾再帰最適化の対応状況
言語 対応状況 備考
java × 非対応
scala ◯ 対応 デフォルトで有効。
@tailrecアノテーションで、非末尾
再帰関数をコンパイルエラーにでき
る
ruby △ 対応 デフォルトでは無効。
tailcall_optimizationオプションを有効にすると利用
可能
javascript △ 対応 ES6からは、実装仕様として要求
Babelではトランスパイル時に最適化するようになっ
ている