Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
FACULTAD DE INGENIERÍA 1 Examen V: Fibonacci Jorge Luis Téllez González, 315132726 Sistemas Distribuidos - Grupo: 01 Resumen—La secuencia de Fibonacci es una serie numérica que ha fascinado a matemáticos y programadores por igual debido a sus múltiples propiedades matemáticas y armónicas que impactan en múltiples campos del conocimiento. En este trabajo exploraremos dos formas de implementar la función de Fibonacci en Java: la primera de manera recursiva y la segunda de manera iterativa. Index Terms—Fibonacci, recursivo, iterativo, Java, rendimiento I. INTRODUCCIÓN LA sucesión de Fibonacci es una secuencia numérica quese define comenzando con los números 0 y 1, y cada número subsiguiente es la suma de los dos números anteriores. En una sucesión recurrente de la forma: r1 = 1, r2 = 1, rn = rn−1 + rn−2 (1) La secuencia continúa infinitamente, y comienza con los siguientes valores: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89... El matemático italiano Leonardo de Pisa, también conocido como Fibonacci, descubrió la sucesión de Fibonacci en el siglo XIII mientras viajaba con su padre, quien era comerciante. Su descubrimiento se produjo al observar cómo se reproducı́an las parejas de conejos. Con el tiempo, se ha descubierto que esta secuencia está presente en varios fenómenos de la naturaleza, como la estructura espiral del caparazón de algunos moluscos y la disposición de las hojas de algunas plantas. También se aplica en campos como la informática y la teorı́a de juegos. La propiedad más significativa de la sucesión de Fibonacci es que si se considera la sucesión de cocientes de un término entre el término anterior, se acerca cada vez más al número áureo, también conocido como Phi (Φ), que es igual a 1+sqrt(5)/2. Esto se refleja en la fórmula siguiente: ĺım n→∞ rn−1 rn = Φ En cuanto a otros usos, tiene aplicaciones en otras áreas clave como en la estadı́stica y la probabilidad, donde se utiliza para modelar el crecimiento de poblaciones y la distribución de valores extremos en una muestra de datos. Programar esta sucesión tiene 2 posibles caminos: una versión recursiva y otra iterativa. La recursividad es un concepto de programación que consiste en que una función se llame a sı́ misma de forma directa o indirecta. Es decir, una función recursiva es aquella que se define en términos de sı́ misma. La recursividad se utiliza para resolver problemas que se pueden dividir en subproblemas más pequeños que tienen la misma estructura que el problema original. De esta forma, la función recursiva resuelve cada uno de los subproblemas, y al combinar las soluciones de todos los subproblemas se obtiene la solución al problema original. function fibonacciRecursivo(n) si n = 0 entonces devolver 0 sino si n = 1 entonces devolver 1 sino devolver fibonacciRecursivo(n-1) + fibonacciRecursivo(n-2) fin si fin function Por otra parte, la técnica iterativa se refiere a solucionar el problema a partir del uso de ciclos; estructuras repetitivas que permiten ejecutar instrucciones dada una condición de inicio, un cuerpo, y una condición de salida. function fibonacciIterativo(n) si n = 0 entonces devolver 0 sino si n = 1 entonces devolver 1 sino a := 0 b := 1 para i desde 2 hasta n hacer c := a + b a := b b := c fin para devolver b fin si fin function En el contexto de la recursividad y la iteración con ciclos, es importante considerar la complejidad computacional de ambas soluciones. Generalmente, las soluciones con ciclos pueden alcanzar complejidades computacionales superiores a O(n2), mientras que la recursividad permite obtener algoritmos ca- paces de alcanzar complejidades cercanas al orden ideal de O(n log n). Tanto la recursividad como la iteración con ciclos tienen sus fortalezas y debilidades, y la elección depende del problema especı́fico y de las necesidades de eficiencia y claridad del código. FACULTAD DE INGENIERÍA 2 Para los propósitos del presente trabajo, analizaremos las diferencias de ejecución entre ambas versiones del algoritmo de Fibonacci por medio de su implementación en Java. Para los propósitos de este prueba, se ejecutarán 100 veces ambas versiones para comprobar el promedio de tiempo obtenido para su ejecución de cada uno de ellos, empleando Sys- tem.nanoTime() para realizar mediciones precisas del tiempo transcurrido entre cada ejecución. II. DESARROLLO II-A. Programa desarrollado Para ejemplificar las diferencias entre los tiempos de ejecu- ción entre ambas técnicas se generó un programa en Java compuesto por 3 clases: la clase principal, FBRecursivo y FBIterativo. Para realizar la implementación y las pruebas, se generó un menú de opciones que permite seleccionar qué metodologı́a usar para ejecutar el algoritmo; como se observa a continuación. Figura 1: Ejecución del programa: selección del tipo de ejecución. La clase FBRecursivo, sin atributos, se encarga de calcular recursivamente los n términos de la sucesión de Fibonacci. Figura 2: Algoritmo de Fibonacci en formato recursivo. Por otra parte, en la clase FBIterativo, que no cuenta con parámetros, se encarga de calcular el n-ésimo término de la serie por medio de un ciclo for que inicia a partir de i=2 (por la forma en que inicia la serie) y comienza a calcular el término siguiente a partir de la suma de los valores anteriores en la serie. Figura 3: Algoritmo de Fibonacci en formato iterativo. En la clase principal, por otra parte, se empieza solicitando al usuario la forma de calcular el algoritmo. Por medio de la lectura de esa opción con un objeto Scanner, se emplea una es- tructura switch para elegir qué caso ejecutar y validar si es una opción correcta o no. En cada una de las opciones sé instancia un nuevo objeto al que se le aplicará el respectivo método de calcular(n), donde n es el número de términos que se desean calcular para la sucesión de Fibonacci. Adicionalmente, se emplea System.nanoTime() para obtener timestamps en nanosegundos que después se trasforman en ms con el fin de obtener un promedio de 100 ejecuciones para cada versión del algoritmo. Figura 4: Clase principal del programa en el switch. II-B. Resultados Para el desarrollo de las pruebas Considerando un promedio de 100 ejecuciones y sus tiempos obtenidos, se llega a los siguientes tiempos: FACULTAD DE INGENIERÍA 3 Para n=10, la versión recursiva arroja 0.1175ms, por otra parte, la versión iterativa obtiene 0.1077ms. Para n=20, la versión recursiva arroja 0.1497ms, por otra parte, la versión iterativa obtiene 0.0873ms. Para n=30, la versión recursiva arroja 3.0183ms, por otra parte, la versión iterativa obtiene 0.0977ms. Para n=40, la versión recursiva arroja 329.2699ms, por otra parte, la versión iterativa obtiene 0.10744ms. Cabe señalar que, para evitar afectar en la medida de lo posible el desempeño de los programas, se eliminaron las impresiones en pantalla y solo se muestran los promedios durante el programa principal. III. CONCLUSIONES Cómo se puede observar, la forma iterativa de este algoritmo se encuentra en un nivel de eficiencia completamente superior con respecto a su contraparte recursiva. Si bien se comentó al inicio de este trabajo que los algoritmos recursivos suelen presentar una ventaja frente a su contrapartes iterativas, en este caso particular el algoritmo recursivo presenta una notable desventaja frente a su contraparte iterativa por el hecho de que el cálculo de los valores de la serie se realiza múltiples veces; malgastando tiempo y recursos de memoria en consecuencia. Este algoritmo podrı́a solucionarse por medio de un enfoque consistente en guardar los valores ya calculados y no repetir el cálculo de elementos de la sucesión que ya habı́an sido calculados previamente. Por tanto, no siempre es el caso de que los algoritmos recursi- vos sean más rápidos que los iterativos, y su implementación depende en gran medida de la naturaleza del problema a resolver y la capacidadde dividirlo en sub-problemas parti- cionables. BIBLIOGRAFÍA [1] UAL. “Sucesión de Fibonacci.” (), dirección: https : / / www2 . ual . es / jardinmatema / sucesion - de - fibonacci/ (visitado 04-04-2023). [2] Wikipedia. “Sucesión de Fibonacci.” (2023), dirección: https: / /es .wikipedia .org/wiki /Sucesi%5C%C3%5C% B3n de Fibonacci (visitado 04-04-2023). [3] KeepCoding. “¿Cómo calcular el Algoritmo de Fibonacci en Scala?” (2023), dirección: https://keepcoding.io/blog/ que-es-el-algoritmo-de-fibonacci/ (visitado 04-04-2023). [4] M. Castañon. “Algoritmo Serie de Fibonacci Pseint.” (2020), dirección: https : / / pseudocodigoejemplos . com / algoritmo - serie - de - fibonacci - pseint/ (visitado 04-04-2023). [5] Parzibyte. “Sucesión fibonacci en Java: método iterativo y recursivo.” (2019), dirección: https://parzibyte.me/blog/ 2019/02/28/sucesion- fibonacci- java- metodo- iterativo- recursivo/ (visitado 04-04-2023). Los créditos de las fotografı́as pertenecen a sus autores. © https://www2.ual.es/jardinmatema/sucesion-de-fibonacci/ https://www2.ual.es/jardinmatema/sucesion-de-fibonacci/ https://es.wikipedia.org/wiki/Sucesi%5C%C3%5C%B3n_de_Fibonacci https://es.wikipedia.org/wiki/Sucesi%5C%C3%5C%B3n_de_Fibonacci https://keepcoding.io/blog/que-es-el-algoritmo-de-fibonacci/ https://keepcoding.io/blog/que-es-el-algoritmo-de-fibonacci/ https://pseudocodigoejemplos.com/algoritmo-serie-de-fibonacci-pseint/ https://pseudocodigoejemplos.com/algoritmo-serie-de-fibonacci-pseint/ https://parzibyte.me/blog/2019/02/28/sucesion-fibonacci-java-metodo-iterativo-recursivo/ https://parzibyte.me/blog/2019/02/28/sucesion-fibonacci-java-metodo-iterativo-recursivo/ https://parzibyte.me/blog/2019/02/28/sucesion-fibonacci-java-metodo-iterativo-recursivo/ Introducción Desarrollo Programa desarrollado Resultados Conclusiones
Compartir