2013-11-04 15 views

Odpowiedz

28

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