2012-05-26 18 views
6

Me pregunto por qué el primer acercamiento al factorial no funciona (ciclo infinito) en ruby ​​mientras que el segundo sí.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 

Respuesta

7

La diferencia es el espacio después del nombre del método, no la forma en que se estructura el if-else.

fac (x-1) * x se analiza como fac((x-1) * x). Básicamente, si un nombre de método es seguido por un espacio (o cualquier token que no sea un paréntesis de apertura), ruby ​​asume que está llamando al método sin paréntesis. Por lo tanto, interpreta los paréntesis alrededor de x-1 como agrupación, no como parte de la sintaxis de la llamada al método.