2012-05-26 13 views
6

Zastanawiam się, dlaczego pierwsze podejście do silni nie działa (nieskończona pętla) w rubinach, podczas gdy drugie robi.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 

Odpowiedz

7

Różnica polega na spacji po nazwie metody, a nie na sposobie, w jaki zbudowałeś swój system if-else.

fac (x-1) * x jest analizowany jako fac((x-1) * x). Zasadniczo, jeśli po nazwie metody występuje spacja (lub dowolny token, który nie jest nawiasem otwierającym), ruby ​​przyjmuje, że wywołujesz metodę bez nawiasów. Interpretuje nawiasy o numerach x-1 jako grupowanie, a nie część składni wywołania metody.