19

Groovy 2.1.9 で再帰クロージャを呼び出すことができません

def facRec = {long n->
    return n>1 ? n * facRec(n - 1) : 1
}

TypeMissmatch が発生しています

4

1 に答える 1

41

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()
于 2013-11-04T10:00:44.157 に答える