mogę zadzwonić rekurencyjnych zamknięć Groovy 2.1.9Recursion z zamknięciem w Groovy 2.1.9
def facRec = {long n->
return n>1 ? n * facRec(n - 1) : 1
}
Dostaję TypeMissmatch
mogę zadzwonić rekurencyjnych zamknięć Groovy 2.1.9Recursion z zamknięciem w Groovy 2.1.9
def facRec = {long n->
return n>1 ? n * facRec(n - 1) : 1
}
Dostaję TypeMissmatch
Kiedy zamknięcie jest zdefiniowana, to nie ma pomysł zmiennej facRec
ponieważ nie został jeszcze zdefiniowany ...
można zrobić:
def facRec
facRec = {long n->
return n>1 ? n * facRec(n - 1) : 1
}
Aby obejść ten problem, albo może owinąć wewnętrzna do innego zamknięcia i zadzwonić do właściciela tej wewnętrznej zamknięcia (choć chciałbym mają tendencję do powyższych, ponieważ jest to łatwiejsze do odczytania):
def facRec = {long n->
{ -> n > 1 ? n * owner.call(n - 1) : 1 }()
}
It należy zauważyć, że oba z nich zawiedzie dla dużych wartościach n
jak będzie przepełnienie stosu
można użyć trampolina obejść to:
def facRec
facRec = { n, count = 1G ->
n > 1 ? facRec.trampoline(n - 1, count * n) : count
}.trampoline()