Groovy 2.1.9では再帰クロージャを呼び出すことができません
def facRec = {long n->
return n>1 ? n * facRec(n - 1) : 1
}
タイプミスマッチが発生しています
ベストアンサー1
クロージャが定義されているときは、変数は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()