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()