Por favor explique este código simple:
public int fibonacci(int n) {
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
Estoy confundido con la última línea, especialmente porque si n = 5, por ejemplo, entonces se llamaría fibonacci (4) + fibonacci (3) y así sucesivamente, pero no entiendo cómo este algoritmo calcula el valor en el índice 5 por este método. ¡Por favor explique con muchos detalles!
Respuestas:
En la secuencia de Fibonacci cada elemento es la suma de los dos anteriores. Entonces, escribiste un algoritmo recursivo.
Entonces,
Ahora ya lo sabes
fibonacci(1)==1 and fibonacci(0) == 0
. Entonces, puede calcular posteriormente los otros valores.Ahora,
Y a partir de la secuencia de Fibonacci
0,1,1,2,3,5,8,13,21....
podemos ver que para5th element
la secuencia de Fibonacci regresa5
.Vea aquí el Tutorial de recursión .
fuente
Hay 2 problemas con su código:
El código
fibonacci(n - 1) + fibonacci(n - 2)
está muy mal.
El problema es que no llama a Fibonacci 50 veces sino mucho más.
Al principio se llama fibonacci (49) + fibonacci (48),
luego fibonacci (48) + fibonacci (47) y fibonacci (47) + fibonacci (46)
Cada vez se vuelve peor fibonacci (n), por lo que la complejidad es exponencial.
El enfoque del código no recursivo:
fuente
2*fibonacci(n+1)-1
, por lo que crece con la misma complejidad que los números de Fibonacci en sí, que es 1.618 ^ n en lugar de 2 ^ nEn el pseudocódigo, donde n = 5, tiene lugar lo siguiente:
Esto se descompone en:
Esto se descompone en:
Esto se descompone en:
Esto se descompone en:
Esto resulta en: 5
Dado que la secuencia de fibonnacci es 1 1 2 3 5 8 ... , el quinto elemento es 5. Puede usar la misma metodología para descubrir las otras iteraciones.
fuente
La recursión puede ser difícil de entender a veces. Simplemente evalúelo en una hoja de papel para un número pequeño:
No estoy seguro de cómo Java realmente evalúa esto, pero el resultado será el mismo.
fuente
También puede simplificar su función, de la siguiente manera:
fuente
Un punto importante a tener en cuenta es que este algoritmo es exponencial porque no almacena el resultado de números calculados previamente. por ejemplo, F (n-3) se llama 3 veces.
Para más detalles, consulte el algoritmo de dasgupta capítulo 0.2
fuente
La mayoría de las respuestas son buenas y explica cómo funciona la recursividad en fibonacci.
Aquí hay un análisis de las tres técnicas que también incluye la recursividad:
Aquí está mi código para probar los tres:
Aquí están los resultados:
Por lo tanto, podemos ver que la memorización es el mejor momento y para las coincidencias de bucle de cerca.
Pero la recursión lleva más tiempo y es posible que deba evitarla en la vida real. Además, si está utilizando la recursividad, asegúrese de optimizar la solución.
fuente
Este es el mejor video que he encontrado que explica completamente la recursión y la secuencia de Fibonacci en Java.
http://www.youtube.com/watch?v=dsmBRUCzS7k
Este es su código para la secuencia y su explicación es mejor de lo que podría tratar de escribirlo.
fuente
Para la solución recursiva de Fibonacci, es importante guardar la salida de números de Fibonacci más pequeños, mientras se recupera el valor de un número mayor. Esto se llama "Memoizing".
Aquí hay un código que utiliza la memorización de los valores de Fibonacci más pequeños, mientras se recupera un número de Fibonacci más grande. Este código es eficiente y no realiza múltiples solicitudes de la misma función.
fuente
En la secuencia de Fibonacci , los dos primeros elementos son 0 y 1, cada uno de los otros elementos es la suma de los dos elementos anteriores. es decir:
0 1 1 2 3 5 8 ...
entonces el quinto elemento es la suma de los elementos cuarto y tercero.
fuente
Michael Goodrich et al proporcionan un algoritmo realmente inteligente en estructuras de datos y algoritmos en Java, para resolver fibonacci recursivamente en tiempo lineal al devolver una matriz de [fib (n), fib (n-1)].
Esto produce fib (n) = fibGood (n) [0].
fuente
Aquí está la solución O (1):
Fórmula del número de Fibonacci de Binet utilizada para la implementación anterior. Para entradas grandes
long
se puede reemplazar conBigDecimal
.fuente
Una secuencia de Fibbonacci es una que suma el resultado de un número cuando se agrega al resultado anterior que comienza con 1.
Una vez que comprendamos qué es Fibbonacci, podemos comenzar a descomponer el código.
El primero si la declaración comprueba un caso base, donde el bucle puede romperse. La otra declaración if a continuación está haciendo lo mismo, pero podría reescribirse así ...
Ahora que se establece un caso base, tenemos que entender la pila de llamadas. Su primera llamada a "fibonacci" será la última en resolverse en la pila (secuencia de llamadas) a medida que se resuelven en el orden inverso desde el que fueron llamadas. El último método llamado se resuelve primero, luego el último llamado antes de ese y así sucesivamente ...
Por lo tanto, todas las llamadas se realizan primero antes de que algo se "calcule" con esos resultados. Con una entrada de 8, esperamos una salida de 21 (ver tabla anterior).
fibonacci (n - 1) se sigue llamando hasta que alcanza el caso base, luego se llama fibonacci (n - 2) hasta que alcanza el caso base. Cuando la pila comienza a sumar el resultado en orden inverso, el resultado será así ...
Siguen burbujeando (resolviendo hacia atrás) hasta que se devuelve la suma correcta a la primera llamada en la pila y así es como obtienes tu respuesta.
Dicho esto, este algoritmo es muy ineficiente porque calcula el mismo resultado para cada rama en la que se divide el código. Un enfoque mucho mejor es uno "de abajo hacia arriba" donde no se requiere Memoization (almacenamiento en caché) o recursividad (stack de llamadas profundas).
Al igual que...
fuente
La mayoría de las soluciones ofrecidas aquí se ejecutan en complejidad O (2 ^ n). Recalcular nodos idénticos en el árbol recursivo es ineficiente y desperdicia ciclos de CPU.
Podemos usar la memorización para hacer que la función fibonacci se ejecute en tiempo O (n)
Si seguimos la ruta de programación dinámica de abajo hacia arriba, el siguiente código es lo suficientemente simple como para calcular fibonacci:
fuente
¿Por qué esta respuesta es diferente?
Cualquier otra respuesta:
(aparte: ninguno de estos es realmente eficiente; use la fórmula de Binet para calcular directamente el enésimo término)
Cola recursiva fib
Aquí hay un enfoque recursivo que evita una llamada doble recursiva al pasar tanto la respuesta anterior como la anterior.
fuente
Es una secuencia básica que muestra u obtiene una salida de 1 1 2 3 5 8 es una secuencia que la suma del número anterior el número actual se mostrará a continuación.
Intenta ver el enlace a continuación Tutorial de la secuencia de Fibonacci recursiva de Java
Haga clic aquí Vea el tutorial de secuencia recursiva de Fibonacci de Java para la alimentación con cuchara
fuente
Creo que esta es una manera simple:
fuente
La respuesta RanRag (aceptada) funcionará bien, pero esa no es una solución optimizada hasta que se memorice como se explica en la respuesta de Anil.
Para el enfoque recursivo, considere el siguiente enfoque, las llamadas a métodos
TestFibonacci
son mínimasfuente
fuente
Al usar un ConcurrentHashMap interno que teóricamente podría permitir que esta implementación recursiva funcione correctamente en un entorno multiproceso, he implementado una función fib que usa BigInteger y Recursion. Toma alrededor de 53 ms para calcular los primeros 100 números de fib.
El código de prueba es:
fuente
Aquí hay un recursivo febonacci de una línea:
fuente
Prueba esto
fuente
Solo para complementar, si desea poder calcular números más grandes, debe usar BigInteger.
Un ejemplo iterativo.
fuente
http://en.wikipedia.org/wiki/Fibonacci_number en más detalles
Haga que sea tan simple como sea necesario, no es necesario usar el bucle while y el otro bucle
fuente
fuente
Uso
while
:La ventaja de esta solución es que es fácil leer el código y comprenderlo, esperando que ayude
fuente
Una secuencia de Fibbonacci es una que suma el resultado de un número que luego hemos agregado al resultado anterior, deberíamos comenzar desde 1. Estaba tratando de encontrar una solución basada en un algoritmo, así que construí el código recursivo, noté que mantengo el número anterior y cambié la posición. Estoy buscando la secuencia de Fibbonacci del 1 al 15.
fuente
fuente
Fibonacci simple
fuente
@chro es perfecto, pero no muestra la forma correcta de hacerlo de forma recursiva. Aquí está la solución:
fuente