在Groovy 2.1.9中使用闭包进行递归

20

我无法在Groovy 2.1.9中调用递归闭包。

def facRec = {long n->
    return n>1 ? n * facRec(n - 1) : 1
}

我遇到了类型不匹配的错误(TypeMissmatch)。

1个回答

43
当定义闭包时,它并不知道变量facRec的存在,因为它尚未被定义...
你可以这样做:
def facRec
facRec = {long n->
    return n>1 ? n * facRec(n - 1) : 1
}

要避免这种情况,或者您可以将内部内容包装在另一个闭包中,并调用该内部闭包的所有者(尽管我倾向于执行上述操作,因为它更易于阅读):

def facRec = {long n->
    { -> n > 1 ? n * owner.call( n - 1 ) : 1 }()
}

需要注意的是,如果n的值很大,这两种方法都会失败,因为你会溢出栈。

你可以使用trampoline来解决这个问题:

def facRec
facRec = { n, count = 1G ->
    n > 1 ? facRec.trampoline( n - 1, count * n ) : count
}.trampoline()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接