我编写了 3 个阶乘算法:
- 我预计会因堆栈溢出而失败。没问题。
- 我尝试尾递归调用,并将以前的算法从递归转换为迭代。它不起作用,但我不明白为什么。
- I use
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.
Java 中没有尾递归,因此 Groovy 中也没有(不使用某些东西)like trampoline() http://www.jroller.com/vaclav/entry/jumping_the_groovy_trampoline正如你所展示的)
我见过的最接近这个的是AST 转换 http://blog.johanneslink.net/2011/02/11/tail-recursion-optimization-with-groovys-ast-transformations/它巧妙地将返回递归包装到 while 循环中
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)