Los números de Fibonacci nos ayudan a modelar crecimiento. La definición de Fibonacci es F(n) = F(n - 1) + F(n - 2). El reto del día de hoy es crear un programa que pueda calcular los número de Fibonacci y que nos digas cuál es el resultado de Fibonacci de 9567. Si estás teniendo problemas, te recomiendo ver este video: https://platzi.com/clases/1835-programacion-estocastica/26430-optimizacion-de-fibonacci/
Fibonacci en JavaScript y en Python (no pude llegar al número 10000 pero muestro los resultados de algunos números, observen que hay diferencias entre los resultados a partir del número 79 ya que parece que JS empieza a redondear desde cierto número de cifras)
// Fibonacci de 10 000 en JavaScript function F(n, memory = {}) { if (n === 0) { return 0 } elseif (n === 1) { return 1 } else { if (memory[n] !== undefined) { returnmemory[n] } else { let result = F(n - 1, memory) + F(n - 2, memory) memory[n] = result return result } } } console.log(F(5)) // 5 console.log(F(50)) // 12586269025 console.log(F(78)) // 8944394323791464 console.log(F(79)) // 14472334024676220 (diferente al resultado en Python) console.log(F(100)) // 354224848179262000000 console.log(F(1000)) // 4.346655768693743e+208 console.log(F(1476)) // 1.3069892237633987e+308 console.log(F(1477)) // Infinity
# Fibonacci de 10 000 en JavaScriptimport sys def F(n, memory = {}): if n == 0: return0elif n == 1: return1try: return memory[n] exceptKeyError: result = F(n - 1) + F(n - 2) memory[n] = resultreturnresultif __name__ == '__main__': sys.setrecursionlimit(100000) print(F(5)) # 5 print(F(50)) # 12586269025 print(F(78)) # 8944394323791464 print(F(79)) # 14472334024676221 (diferente al resultado en JS) print(F(100)) # 354224848179261915075 print(F(1000)) # 43466557686937456435688527675040625802564660517371780402481729089536555417949051890403879840079255169295922593080322634775209689623239873322471161642996440906533187938298969649928516003704476137795166849228875
En Python:
""" Programa para calcular el número de Fibonacci del número ingresado por el usuario. Program to calculate the Fibonacci number of the number entered by the user. """import sys def fibonacci_dynamic(number, memo = {}): if number == 0or number == 1: return1try: return memo[number] exceptKeyError: result = fibonacci_dynamic(number - 1, memo) + fibonacci_dynamic(number - 2, memo) memo[number] = resultreturnresultif __name__ == '__main__': sys.setrecursionlimit(10002) print('FIBONACCIOF10000!!!') number = input('Choose a number: ') whilenot (number.isdigit() andint(number) >= 0): number = input('Invalid entry. Please choose a integer number greater than or equal to zero: ') result = fibonacci_dynamic(int(number)) print('Fibonacciof your number ({}) is: {}' .format(number, result))
Este fue mi resultado en Python. 🐍
import sys deffibonacci(n, memory = {}):if n == 1or n == 2: return1try: return memory[n] except KeyError: resultado = fibonacci(n - 1, memory) + fibonacci(n - 2, memory) memory[n] = resultado return resultado defrun(): n = 9567 result = fibonacci(9567) print(f'Fibonacci of {n} = {result}') if __name__ == "__main__": sys.setrecursionlimit(10002) run()
No se por que no me aparece en python, literalmente copié lo mismo que el profe pero solo me aparece como hasta 3000. Intenté también en javascript, hasta en el entorno de nodejs pero me lanza infinito o cuando ingreso un número muy alto, el problema del maximum stack, pero en todo caso aquí dejo los códigos:
<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Serie de Fibonacci</title></head><style> * { margin: 0; } .contenedor { display: flex; flex-direction: column; align-items: center; justify-content: center; height: 100vh; } .section { padding: 0.25rem2rem; display: flex; align-items: center; } .sectioninput{ margin-left: 12px; width: 80px; margin-right: 10px; text-align: center; } .inputs { display: flex; flex-flow: column; align-items: center; padding: 2rem; } .btn { border: 2px solid black; border-radius: 6px; cursor: pointer; } #contra { padding: 020px; width: 95%; } </style><body><divclass="contenedor"><h1style="margin-bottom: 24px;">Serie de Fibonacci</h1><divclass="inputs"><sectionclass="section"> Que posición de la serie deseas saber? <inputid="n"placeholder="Número..."/></section><h2id='resultado'></h2></div><buttonaccesskey="enter"onclick="calcula()"class="btn"id='boton'>Calcular...</button></div><script>functioncalcula() { const n = document.getElementById('n').value const resultado = document.getElementById('resultado') // function fibonacciRecursivo(n){// if (n === 0 || n === 1) return 1// return fibonacciRecursivo(n-1) + fibonacciRecursivo(n-2)// }functionfibonacciDinamico(n, memo = {}){ if (n === 0 || n === 1) return1if (memo[n]) { return memo[n] } else { let res = fibonacciDinamico(n - 1, memo) + fibonacciDinamico(n - 2, memo) memo[n] = res return res } } console.log(fibonacciDinamico(n)) return resultado.innerHTML = fibonacciDinamico(n) } </script></body></html>
Py:
import sys deffibonacci_recursivo(n):if n == 0or n == 1: return1return fibonacci_recursivo(n - 1) + fibonacci_recursivo(n - 2) deffibonacci_dinamico(n, memo = {}):if n == 0or n == 1: return1try: return memo[n] except KeyError: resultado = fibonacci_dinamico(n - 1, memo) + fibonacci_dinamico(n - 2, memo) memo[n] = resultado return resultado if __name__ == '__main__': sys.setrecursionlimit(10010) n = int(input('Escoge un numero: ')) resultado = fibonacci_dinamico(n) print(resultado)
Investigando un poco es por que el Number en javascript tiene un MAX_VALUE que no se puede modificar :c
// Escriban en la consola Number.MAX_VALUE1.7976931348623157e+308
Me pueden ayudar? No se por que mi consola solo imprime hasta 2287

A partir de 2287 para adelante no me imprime nada
En Python 😃
import sys deffibonacci_dinamico(n, memo = {}):if n == 0or n == 1: return1try: return memo[n] except KeyError: resultado = fibonacci_dinamico(n - 1, memo) + fibonacci_dinamico(n - 2, memo) memo[n] = resultado return resultado if __name__ == '__main__': sys.setrecursionlimit(10002) n = int(input('Escoge un numero: ')) resultado = fibonacci_dinamico(n) print(resultado)```
Reto 33 Fibonacci en Java 😃
publicclass FibonacciMejorado { publicstatic BigInteger fibonacciDinamico(int n){ if (n == 0) { return BigInteger.ZERO; } else { BigInteger[] array = new BigInteger[(int) n + 1]; array[0] = BigInteger.valueOf(0); array[1] = BigInteger.valueOf(1); for (int i = 2; i <= n; i++) { array[i] = array[i - 1].add(array[i - 2]);//suma -1 y -2 } returnarray[(int) n]; } } publicstaticvoidmain(String[] args){ Scanner scanner = new Scanner(System.in); System.out.println("Ingresa un número para calcular su Fibonacci"); int n = scanner.nextInt(); System.out.println(fibonacciDinamico(n)); } }
Ejecución Fibonacci de 10000

Mi código en JS y C. A partir de 40-50 tarda demasiado. Interesante la solución compartida por otros compañeros guardando el último número en memoria que a la vez se pasa por parámetro.
https://github.com/ceporro/PlatziCodingChallenge/tree/master/Day 33
Reto 33: Fibonacci de 10,000
Repositorio del reto: PlatziCodingChallengeRepo
GitHub pages: PlatziCodingChallengePages
<!DOCTYPE html><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=device-width, initial-scale=1.0"><title>Reto 33: Fibonacci de 10,000</title></head><style>body { display: flex; flex-direction: column; align-items: center; } </style><body><h1>Fibonacci de 10,000</h1><labelfor="">Ingresa un número:</label><inputid="number"type="number"><buttontype="button"onclick="handleFibonacci()">Calcular Fibonacci</button><h2id="result"></h2><script>functionfibonacci(n, memo) { memo = memo || {} if (memo[n]) { return memo[n] } if (n <= 1) { return1 } return memo[n] = fibonacci(n - 1, memo) + fibonacci(n - 2, memo) } functionmemoizer(fun) { let cache = {} returnfunction (n) { if (cache[n] != undefined) { return cache[n] } else { let result = fun(n) cache[n] = result return result } } } const fibonacciMemoFunction = memoizer(fibonacci); functionhandleFibonacci() { let result = document.getElementById("result"); let number = Number.parseInt(document.getElementById("number").value); let fibo = fibonacciMemoFunction(number); result.innerHTML = fibo; } </script></body></html>
Es interesante el uso de la memoria, con este problema pude aprender cosas nuevas:
1.- Las operaciones por mas básica que parezcan de igual forma consumen memoria, no me daba cuenta porque pensaba en operaciones sencillas pero cuando se trata de operaciones exponenciales es otra cosa.
2.- Es importante siempre pensar en como optimizar los métodos que desarrollo, tomando en cuenta la memoria.
3.- Estar al día sobre las técnicas para la optimización de memoria.
4.- Una desventaja de JavaScript es que el valor entero máximo que puede representar es 9007199254740991 y todos los valores por encima los trata como infinity.
Les comparto una fuente que me ayudo en la realización de este reto: https://scotch.io/tutorials/understanding-memoization-in-javascript