我无法在Groovy 2.1.9中调用递归闭包
def facRec = {long n->
return n>1 ? n * facRec(n - 1) : 1
}
Run Code Online (Sandbox Code Playgroud)
我得到了一个TypeMissmatch
tim*_*tes 34
在定义闭包时,它不知道变量 facRec因为它尚未定义...
你可以做:
def facRec
facRec = {long n->
return n>1 ? n * facRec(n - 1) : 1
}
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,或者你可以将内部包装到另一个闭包中并调用该内部闭包的所有者(尽管我倾向于执行上面的操作,因为它更容易阅读):
def facRec = {long n->
{ -> n > 1 ? n * owner.call( n - 1 ) : 1 }()
}
Run Code Online (Sandbox Code Playgroud)
应该注意的是,这两个都会因为大的值而失败,n因为你会溢出堆栈
你可以使用蹦床来解决这个问题:
def facRec
facRec = { n, count = 1G ->
n > 1 ? facRec.trampoline( n - 1, count * n ) : count
}.trampoline()
Run Code Online (Sandbox Code Playgroud)