2013-11-04 13 views

Antwort

28

Wenn der Verschluss definiert wird, hat es keine Idee der variablen facRec als es noch nicht definiert worden ist ...

können Sie tun:

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

Um dies zu umgehen, oder Sie können die Innen in einer anderen Verschluss wickeln und den Besitzer des inneren Verschlusses nennen (obwohl ich die oben tun würde dazu neigen, da es einfacher ist zu lesen):

def facRec = {long n-> 
    { -> n > 1 ? n * owner.call(n - 1) : 1 }() 
} 

Es sollte beachtet werden, dass beide von ihnen werden für große Werte von n nicht, wie Sie den Stack überlaufen wird

Sie Trampolin das umgehen können:

def facRec 
facRec = { n, count = 1G -> 
    n > 1 ? facRec.trampoline(n - 1, count * n) : count 
}.trampoline()