19

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

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

我得到一个 TypeMissmatch

4

1 回答 1

41

定义闭包时,它不知道变量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因为您将溢出堆栈

您可以使用蹦床来解决这个问题:

def facRec
facRec = { n, count = 1G ->
    n > 1 ? facRec.trampoline( n - 1, count * n ) : count
}.trampoline()
于 2013-11-04T10:00:44.157 回答