【发布时间】:2011-09-10 21:42:46
【问题描述】:
我编写了 3 个阶乘算法:
- 我预计会因堆栈溢出而失败。没问题。
- 我尝试了尾递归调用,并将之前的算法从递归转换为迭代。它不起作用,但我不明白为什么。
- 我使用
trampoline()方法,它可以正常工作。
def factorial
factorial = { BigInteger n ->
if (n == 1) return 1
n * factorial(n - 1)
}
factorial(1000) // stack overflow
factorial = { Integer n, BigInteger acc = 1 ->
if (n == 1) return acc
factorial(n - 1, n * acc)
}
factorial(1000) // stack overflow, why?
factorial = { Integer n, BigInteger acc = 1 ->
if (n == 1) return acc
factorial.trampoline(n - 1, n * acc)
}.trampoline()
factorial(1000) // It works.
【问题讨论】:
标签: groovy recursion tail-recursion factorial tail-call-optimization