Sucesión de Fibonacci con Ruby
La Sucesión de Fibonacci es una sucesión de números enteros iniciando con dos números base, 0 y 1. Cada número de la sucesión es el resultado de la suma de los dos anteriores; por ejemplo:
[0] [1] [1] [2] [3] [5] [8] [13] [21] [34]
Esta Sucesión de Fibonacci solo muestra 10 números y se observa cómo se genera cada número sumando los dos números anteriores, es decir: 0 + 1 = 1, 1 + 1 = 2, 1 + 2 = 3, 2 + 3 = 5… hasta 13 + 21 = 34…
Código fuente:
El programa que nos permite generar la Sucesión de Fibonacci en Ruby es muy sencillo y tan solo ocupa un total de 15 líneas de código, es interactivo ya que le permite al usuario el límite de números de la sucesión.
#!/usr/bin/env ruby tmp, fib = 1, 0 print "Ingrese el numero máximo de la Sucesión de Fibonacci: " rango = gets().to_i if rango > 0 (1..rango).each { print "[#{fib}] " tmp = tmp + fib fib = tmp - fib } puts "" else puts "El número ingresado debe ser mayor a cero!!" end
El lenguaje de programación Ruby forma parte de lo que se conoce como Lenguajes Interpretados, eso quiere decir que los programas no requieren ser compilados sino que sólo requieren un intérprete que se encarga de leer línea por línea e interpretarlas en tiempo de ejecución. Ruby tiene una sintaxis sencilla y limpia.
Shebang #!/usr/bin/env ruby:
Los caracteres #! son conocidos como Shebang y son muy famosos en los sistemas tipo UNIX ya que permite ejecutar programas que requieren un intérprete, directamente sobre la línea de comandos sin necesidad de escribir el nombre del intérprete; por ejemplo, ./SucesionFibo.rb en lugar de $ruby SucesionFibo.rb.
Declarando variables con asignación múltiple:
tmp, fib = 1, 0
La asignación múltiple en Ruby es posible solo si se cumple una sola regla, debe existir un número de valores igual al número de variables a la izquierda. En este fragmento de código se crean 2 variables de tipo int, una llamada tmp que se inicializa con un valor de 1 y la otra, llamada fib, que se inicializa con un valor de 0.
Solicitando y leyendo información ingresada por el usuario:
print "Ingrese el número máximo de la Sucesión de Fibonacci: " rango = gets().to_i
Le solicitamos al usuario que ingrese un que representara el rango máximo de la Sucesión de Fibonacci con la función print para evitar los saltos de línea. Luego leemos el dato ingresado por el usuario usando gets() y lo almacenamos en una nueva variable llamada rango; pero dicho valor debe ser convertido a un tipo int debido a que todo dato leído por gets es de tipo string, esta labor se hace invocando a to_i.
Procesando información y mostrando resultado:
if rango > 0 (1..rango).each { print "[#{fib}] " tmp = tmp + fib fib = tmp - fib } puts "" else puts "El número ingresado debe ser mayor a cero!!" end
El proceso interno comienza con una sentencia if la cual verifica que la variable rango sea mayor a 0, esto es necesario porque la Sucesión de Fibonacci siempre va en un rango desde 1 hasta N; por ejemplo, si queremos mostrar los 10 primeros números de la sucesión como se hizo al inicio, usaremos un bucle desde 1 hasta N y es aquí en donde la sentencia if garantiza el correcto procesamiento.
Recorriendo el rango, método .each {}:
(1..rango).each { print "[#{fib}] " tmp = tmp + fib fib = tmp - fib }
Si la sentencia if es evalúa a true, entonces se inicia el procesamiento de la información. El método .each {} va a recorrer un rango de números que van desde 1 hasta rango, al interior hay una función print que imprime cada número de la Sucesión de Fibonacci encerrado entre corchetes [..] usando interpolación de strings.
Hay dos operaciones básicas, la primera corresponde a la suma tmp = tmp + fib la cual toma el valor en tmp y lo suma con fib, y lo asigna de nuevo a tmp. La segunda, es la resta fib = tmp – fib que da como resultado el número Fibonacci que se imprime en pantalla con la función print anterior. La sentencia else solo emite un mensaje en caso de que el número ingresado es cero o menos a cero.
¿Como funciona internamente las operaciones aritméticas?:
Como se describe arriba, hay dos operaciones aritméticas básicas, la primera es una suma y la segunda es una resta; pero, ¿cómo funcionan tras bambalinas? Aquí veremos lo que ocurre con cada operación.
Primera operación aritmética, tmp = tmp + fib:
Para ilustrar lo que ocurre con esta primera operación aritmética, he modificado el código para imprimir una tabla que nos muestre con mayor detalles los cambios en las variables con cada iteración.
Ingrese un numero para la sucesion de fibonacci: 10 | Valores iniciales | = | nuevo valor de Tmp | | Fib Tmp | | tmp = tmp + fib | | [0] + [1] | = | [1] | | [1] + [1] | = | [2] | | [1] + [2] | = | [3] | | [2] + [3] | = | [5] | | [3] + [5] | = | [8] | | [5] + [8] | = | [13] | | [8] + [13] | = | [21] | | [13] + [21] | = | [34] | | [21] + [34] | = | [55] | | [34] + [55] | = | [89] |
Al inicio de esta publicación se dijo que la serie inicia con 2 números base, 0 y 1. Al lado izquierdo de la tabla se muestra que Fib tiene como valor inicial 0 mientras que Tmp tiene como valor inicial 1; al lado derecho se muestra cada cambio en el valor de la variable Tmp después de la suma hecha en cada iteración.
Segunda operacion aritmetica, fib = tmp – fib:
Para ilustrar lo que ocurre con esta segunda operación aritmética, he modificado nuevamente el código para imprimir una tabla que nos muestre con mayor detalles los cambios en las variables con cada iteración.
Ingrese un numero para la sucesion de fibonacci: 10 | fib = tmp - fib | = | Resultado de la Sucesion | | Tmp Fib | | Numero Fibonacci | | [1] - [1] | = | [0] | | [2] - [1] | = | [1] | | [3] - [2] | = | [1] | | [5] - [3] | = | [2] | | [8] - [5] | = | [3] | | [13] - [8] | = | [5] | | [21] - [13] | = | [8] | | [34] - [21] | = | [13] | | [55] - [34] | = | [21] | | [89] - [55] | = | [34] |
Con la anterior operación aritmética se altera el valor de la variable tmp, se dijo que este valor es mayor que el valor de fib y la tabla nos muestra que efectivamente si es así; excepto en los primeros valores cuyo valor es igual. Al realizar la resta entre tmp y fib nos da como resultado el valor del número Fibonacci; este resultado coincide con el valor de la variable fib en la tabla de la anterior operación.
# creo que asi es mas facil…
num = 10
x, y = 0, 1
num.times do
puts y
x, y = y, x + y
end