Groovy 2.1.9 でのクロージャを使用した再帰 質問する

Groovy 2.1.9 でのクロージャを使用した再帰 質問する

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

おすすめ記事