{"id":448,"date":"2025-03-22T12:01:44","date_gmt":"2025-03-22T11:01:44","guid":{"rendered":"https:\/\/www.pythonparatodo.com\/?p=448"},"modified":"2025-03-22T12:01:44","modified_gmt":"2025-03-22T11:01:44","slug":"la-sucesion-de-fibonacci-conejos-y-python","status":"publish","type":"post","link":"https:\/\/www.pythonparatodo.com\/?p=448","title":{"rendered":"La sucesi\u00f3n de Fibonacci: conejos y Python"},"content":{"rendered":"\n<p><strong>Introducci\u00f3n<\/strong><\/p>\n\n\n\n<p>Viajemos en el tiempo hasta la Italia del siglo XIII para conocer al hombre detr\u00e1s de esta maravilla matem\u00e1tica:\u00a0<strong>Leonardo de Pisa<\/strong>, m\u00e1s conocido como\u00a0<strong>Fibonacci<\/strong>. Leonardo fue un matem\u00e1tico brillante de la Edad Media. Su obra m\u00e1s famosa, el\u00a0<em>Liber Abaci<\/em>, introdujo en Europa el sistema de numeraci\u00f3n indo-ar\u00e1bigo (9,8,7,6,5,4,3,2,1), el que utilizamos hoy en d\u00eda, reemplazando al engorroso sistema romano. En este libro Fibonacci planteo un problema sobre la reproducci\u00f3n de los conejos:<\/p>\n\n\n\n<p><strong>El problema<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Imagina que tienes una pareja de conejos reci\u00e9n nacidos, macho y hembra.<\/li>\n\n\n\n<li>Los conejos pueden aparearse al mes de edad.<\/li>\n\n\n\n<li>Despu\u00e9s de un mes de gestaci\u00f3n, la hembra da a luz a otra pareja de conejos, tambi\u00e9n macho y hembra.<\/li>\n\n\n\n<li>Sup\u00f3n que los conejos nunca mueren.<\/li>\n<\/ul>\n\n\n\n<p>\u00bfCu\u00e1ntas parejas habr\u00e1 despu\u00e9s de un a\u00f1o?<\/p>\n\n\n\n<p><strong>La soluci\u00f3n<\/strong><\/p>\n\n\n\n<p>Resolviendo este problema, Fibonacci descubri\u00f3 una secuencia num\u00e9rica:<\/p>\n\n\n\n<p>0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, &#8230;<\/p>\n\n\n\n<p>La l\u00f3gica en esta secuencia es que cada n\u00famero despu\u00e9s de los dos primeros es la suma de los dos n\u00fameros precedentes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>0 + 1 = 1<\/li>\n\n\n\n<li>1 + 1 = 2<\/li>\n\n\n\n<li>1 + 2 = 3<\/li>\n\n\n\n<li>2 + 3 = 5<\/li>\n\n\n\n<li>5 + 3 = 8<\/li>\n\n\n\n<li>Y as\u00ed sucesivamente<\/li>\n<\/ul>\n\n\n\n<p>Aunque el planteamiento hablaba sobre conejos, se descubri\u00f3 que esta sucesi\u00f3n era un patr\u00f3n fundamental en la naturaleza y las matem\u00e1ticas.<\/p>\n\n\n\n<p>Por ejemplo, hay patrones en la naturaleza que son mas o menos fieles a esta sucesi\u00f3n de n\u00fameros, como son las semillas de girasol, la espiral de una concha de caracol, la ramificaci\u00f3n de los \u00e1rboles, incluso el n\u00famero \u00e1ureo ya que si divides cualquier n\u00famero de la sucesi\u00f3n de Fibonacci por el n\u00famero que le precede (por ejemplo, 8\/5 = 1.6, 13\/8 = 1.625, 21\/13 \u2248 1.615) a medida que avanzas en la secuencia el resultado se parece mas al <strong>n\u00famero \u00e1ureo<\/strong> el cual es un n\u00famero irracional cuya representaci\u00f3n decimal es infinita y no tiene periodo, llamado tambi\u00e9n <strong>el n\u00famero de oro<\/strong> o <strong>el numero De Dios<\/strong>. En inform\u00e1tica la sucesi\u00f3n de Fibonacci aparece en diversos algoritmos y estructuras de datos, como la b\u00fasqueda binaria, la generaci\u00f3n de n\u00fameros pseudoaleatorios y ciertas estructuras de datos llamadas <strong>mont\u00edculos de Fibonacci<\/strong>.<\/p>\n\n\n\n<p><strong>\u00bfY Python?<\/strong><\/p>\n\n\n\n<p>Ya hemos llegado a lo que nos interesa, como generar la secuencia de Fibonacci con Python. Vamos a hacer primero una funci\u00f3n que nos muestre una cantidad de n\u00fameros de la secuencia determinada comenzando por el primero. Para ello escribimos este script:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">def generar_fibonacci(n):\n    \"\"\"\n    Genera los primeros n n\u00fameros de la sucesi\u00f3n de Fibonacci.\n    \"\"\"\n    if n &lt;= 0:\n        return\n    elif n == 1:\n        return [0]\n    else:\n        lista_fib = [0, 1]\n        while len(lista_fib) &lt; n:\n            siguiente_fib = lista_fib[-1] + lista_fib[-2]\n            lista_fib.append(siguiente_fib)\n        return lista_fib\n\n# Generar los n\u00fameros de Fibonacci\ncantidad = 10\nsecuencia_fibonacci = generar_fibonacci(cantidad)\n\n# Imprimir la secuencia\nprint(f\"Los primeros {cantidad} n\u00fameros de la secuencia de Fibonacci son:\")\nfor numero in secuencia_fibonacci:\n    print(numero, end=\", \")<\/code><\/pre>\n\n\n\n<p>La funci\u00f3n generar_bibonacci(n) recibe el par\u00e1metro n que indica la cantidad de n\u00fameros de la sucesi\u00f3n que se van a generar. La primera comprobaci\u00f3n es obligada ya que si la cantidad es 0 o inferior no habr\u00e1 sucesi\u00f3n y si solo fuera un elemento este ser\u00eda el 0. Sin embargo si hemos pasado un n\u00famero superior, usando una lista con dos valores y comenzando con 0,1 <em><strong>lista_fib = [0, 1]<\/strong><\/em> iremos a\u00f1adiendo elementos a la lista con <em><strong>lista_fib.append(siguiente_fib<\/strong>)<\/em> hasta que nuestra lista mida lo mismo que el par\u00e1metro pasado <em><strong>while len(lista_fib) &lt; n:<\/strong><\/em> y esos n\u00fameros ser\u00e1n la suma del \u00faltimo valor de la lista mas el anterior (<em><strong>siguiente_fib = lista_fib[-1] + lista_fib[-2]<\/strong><\/em>)<\/p>\n\n\n\n<p><strong>Volviendo al problema de los conejos<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"python\" class=\"language-python\">def problema_conejos_fibonacci(meses):\n    \"\"\"\n    Calcula el n\u00famero de parejas de conejos despu\u00e9s de un n\u00famero dado de meses,\n    siguiendo el problema original de Fibonacci.\n    \"\"\"\n    if meses &lt;= 0:\n        return 0\n    elif meses == 1:\n        return 1\n    else:\n        a, b = 1, 1  # Inicializamos con la pareja del primer mes y la pareja madura del segundo mes\n        for _ in range(2, meses):\n            nueva_pareja = a + b\n            a, b = b, nueva_pareja\n        return b\n\n# Calcular el n\u00famero de parejas despu\u00e9s de 12 meses (un a\u00f1o)\nmeses_transcurridos = 12\nparejas_finales = problema_conejos_fibonacci(meses_transcurridos)\n\n# Imprimir el resultado\nprint(f\"Despu\u00e9s de {meses_transcurridos} meses, habr\u00e1 {parejas_finales} parejas de conejos.\")<\/code><\/pre>\n\n\n\n<p><\/p>\n\n\n\n<p>Para resolver el problema de los conejos usamos una funci\u00f3n un poco diferente ya que el problema dec\u00eda que hab\u00edan dos conejos, por tanto no podemos comenzar la secuencia con 0 y 1, sino mas bien con 1 y 1, adem\u00e1s lo que queremos no es la secuencia en s\u00ed sino el n\u00famero que se obtiene despu\u00e9s de seguir la secuencia despu\u00e9s de un a\u00f1o, es decir 12 meses.<\/p>\n\n\n\n<p>En este caso hacemos un bucle para ir asignado durante cada mes los valores, es decir el primer mes a vale 1 y b vale 1, el segundo mes sumamos a+b e intercambiamos los valores, es decir a=b y b=suma de a+b, el siguiente mes volvemos a hacer lo mismo y siempre tendremos en b el valor total de conejos.<\/p>\n\n\n\n<p>Espero que os haya gustado, si es as\u00ed comentad.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Viajemos en el tiempo hasta la Italia del siglo XIII para conocer al hombre detr\u00e1s de esta maravilla matem\u00e1tica:\u00a0Leonardo &hellip; <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[165,163,164,2,6],"class_list":["post-448","post","type-post","status-publish","format-standard","hentry","category-python","tag-conejos","tag-fibonacci","tag-matematicas","tag-python","tag-python3"],"_links":{"self":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/448","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=448"}],"version-history":[{"count":7,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/448\/revisions"}],"predecessor-version":[{"id":455,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=\/wp\/v2\/posts\/448\/revisions\/455"}],"wp:attachment":[{"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=448"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=448"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.pythonparatodo.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=448"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}