8.1. Factoriales

El siguiente guión aparece en el capítulo Ejemplos sencillos.


01 def fact(n)
02 if n == 0
03  1
04 else
05  n * fact(n-1)
06 end
07 end
08 print fact(ARGV[0].to_i), "\n"

Debido a que es la primera explicación de un código, vamos a ir línea por línea.


01 def fact(n)

En la primera línea, def es la sentencia que define una función (o con mayor precisión, un método; trataremos con más detalle los métodos en un capítulo posterior). Aquí se indica que la función fact toma un único argumento, que se llama n.


02 if n == 0

Con if comprobamos una condición. Si la condición es cierta, se evalúa la siguiente línea; si no independientemente de lo que siga se evalúa el else


03  1

Si la condición es cierta el valor del if es 1.


04 else

Si la condición no es cierta, se evalúa el código desde esta línea hasta el end.


05  n * fact(n - 1)

Si no se satisface la condición el valor de if es el resultado de multiplicar fact(n-1) por n.


06 end

El primer end cierra la sentencia if.


07 end

El segundo end cierra la sentencia def.


08 print fact(ARGV[0].to_i), "\n"

Llama a la función fact() con el argumento especificado en la línea de comandos, e imprime el resultado.

ARGV es un array que contiene los argumentos de la línea de comandos. Los miembros de ARGV son cadenas por lo que hay que convertirlos a números enteros con to_i. Ruby no convierte automáticamente las cadenas a números como hace Perl.

Hmmm... ¿Qué pasa si alimentamos este programa con un número negativo? ¿Se ve cuál es el problema? ¿Cómo se podría solucionar?