Groovy 的尾递归

2024-02-21

我编写了 3 个阶乘算法:

  1. 我预计会因堆栈溢出而失败。没问题。
  2. 我尝试尾递归调用,并将以前的算法从递归转换为迭代。它不起作用,但我不明白为什么。
  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(使用前将#替换为@)

Groovy 的尾递归 的相关文章

随机推荐