用Groovy进行尾递归

Art*_*ero 6 recursion groovy tail-recursion factorial tail-call-optimization

我编码了3个因子算法:

  1. 首先,我希望Stack Overflow失败.没问题.
  2. 其次,我尝试尾部重用调用,将先前的算法从递归转换为迭代.它不起作用,但我不明白为什么.
  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
Run Code Online (Sandbox Code Playgroud)

joh*_*ink 1

从版本 2.3 开始,Groovy 通过方法的 @TailRecursive 注释支持尾递归: http://java.dzone.com/articles/groovy-goodness-more-efficient