Pero si que es conveniente si lo haces con memoria, esto lo que hará es ahorrar un gran número de operaciones ya que las que ya ha calculado las guarda en un mapa y cuando se necesita se utilizan los resultados guardados:
public static int fibonacciMemoria(int n, Map<Integer, Integer> m){
int res = 0;
if(n<=1){
return n;
}else{
int fibon1 = 0;
int fibon2 = 0;
if(m.containsKey(n-1)){
fibon1 = m.get(n-1);
}else{
fibon1 = fibonacciMemoria(n-1,m);
}
if(m.containsKey(n-2)){
fibon2 = m.get(n-2);
}else{
fibon2 = fibonacciMemoria(n-2,m);
}
res = fibon1+fibon2;
m.put(n, res);
}
return res;
}
Y ya si quieres calcular con números mas grandes puedes hacerlo con BigInteger de igual forma:
return n;
}else{
if(m.
containsKey(n.
subtract(new BigInteger("1")))){ }else{
fibon1
= fibonacciGrande
(n.
subtract(new BigInteger("1")),m
); }
if(m.
containsKey(n.
subtract(new BigInteger("2")))){ }else{
fibon2
= fibonacciGrande
(n.
subtract(new BigInteger("2")),m
); }
res = fibon1.add(fibon2);
m.put(n, res);
}
return res;
}
Un saludo.
Exactamente como dice
kakimanu, se puede hacer el fibonacci de forma dinámica, aqui les dejo un ejemplo recursivo de la forma dinamica manteniendo los valores ya calculados en un array de
long, a mi entender un poquito más sencilla.
static void Main(string[] args)
{
long n = long.Parse(Console.ReadLine()); //Se solicita el termino de fibonacci a calcular
fibonacci
= new long[n
+1]; Console.WriteLine(Fibonacci(n));
}
static long Fibonacci(long n)
{
if (fibonacci[n] != 0) //Se verifica si no se calculo ya
return fibonacci[n]; //Se devuelve si ya se calculo
if (n == 1 || n==2)
return 1;
fibonacci[n - 2] = Fibonacci(n - 2); //se guarda en el array
fibonacci[n - 1] = Fibonacci(n - 1); //se guarda en el array
return fibonacci[n - 2] + fibonacci[n - 1];
}