13
我無法遞歸調用封在Groovy 2.1.9遞歸與Groovy閉2.1.9
def facRec = {long n->
return n>1 ? n * facRec(n - 1) : 1
}
我得到一個TypeMissmatch
我無法遞歸調用封在Groovy 2.1.9遞歸與Groovy閉2.1.9
def facRec = {long n->
return n>1 ? n * facRec(n - 1) : 1
}
我得到一個TypeMissmatch
當被定義的關閉,它沒有因爲它尚未定義的變量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()