Si quieres darle una pequeña vuelta de tuerca más puedes usar los siguientes trucos:
mejor preincrementos a postincrementos:
// esto
++variable;
// es mas optimo que esto ( como norma general, ya que depende de las optimizaciones del compilador )
variable++;[/code ]
Para dividir entre dos, es muuuucho más óptimo usar desplazamientos binarios:
[code=c]
// esto
variable = variable >> 1;
// es más óptimo que esto
variable = variable / 2;
Esto lo podrías optimizar un pelin ( siendo quisquillosos )
// Con código redundante
if(n == 0)
return 0;
if(n == 1)
return 1;
if(n == 2) //Evitamos recurion infinita si n == 2
return 1;
// Optimizado
if(n == 0)
return 0;
if(n <= 2) // Se evita una comprobacion en cada pasada
return 1;
Si reutilizas algún cálculo costoso, intenta precalcularlo
// Sin optimizar
return fibo(n / 2) * (fibo((n / 2) + 1) + fibo((n / 2) - 1));
// Optimizado
int temp = n / 2; // o mejor aun temp = n >> 1;
return fibo( temp ) * ( fibo( temp + 1 ) + fibo( temp - 1 ) );
También creo recordar, no estoy 100% seguro, que para saber si un número es divisible entre 2 se puede optimizar también de la siguiente forma ( como no aprovechando desplazamientos binarios ):
// Sin optimizar
if(n % 2) //n impar y mayor que 2
// optimizado
if ( ( n >> 1 << 1 ) == n )
Esto último básicamente consiste en eliminar el bit de menor peso del número ... si es par, ese dígito es cero y el número permanece invariable.
Son truquillos tontos si quieres conseguir arañar hasta la última señal de reloj del procesador.
Eso si, te lo has currado, no voy a ser yo el que te quite el mérito.
Enhorabuena.[/code]