4

#PlatziCodingChallenge dia # 33 - Fibonacci de 10,000

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/

Escribe tu comentario
+ 2
Ordenar por:
2
19943Puntos

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
1

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))
Captura4.JPG
1
26494Puntos

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()
1
7689Puntos

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)
2
7689Puntos
7 meses

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
1
7689Puntos
7 meses

Me pueden ayudar? No se por que mi consola solo imprime hasta 2287

A partir de 2287 para adelante no me imprime nada

1

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)```
1
6327Puntos

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

0
17607Puntos

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>
0
17607Puntos
11 días

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