2012-05-26 17 views
6

Mi chiedo perché il primo approccio a factorial non funzioni (loop infinito) in ruby ​​mentre il secondo fa.Ruby recursion issue

def fac (x) 
    if x == 0 
    return 1 
    else 
    return (fac (x-1) * x) 
    end 
end 

def fact(num) 
    return 1 if num == 0 

    fact(num - 1) * num 
end 

risposta

7

La differenza è lo spazio dopo il nome del metodo, non il modo in cui hai strutturato il tuo if-else.

fac (x-1) * x viene analizzato come fac((x-1) * x). Fondamentalmente se un nome di metodo è seguito da uno spazio (o qualsiasi token che non è una parentesi aperta), ruby ​​presume che tu stia chiamando il metodo senza parentesi. Quindi interpreta le parentesi intorno a x-1 come raggruppamento, non una parte della sintassi di chiamata del metodo.