Cuando un comando de retorno tiene dos llamadas recursivas, tales como return fib(n-1) + fib(n-2);
, están las llamadas realizadas al mismo tiempo, o es fib(n-1)
ejecutada antes fib(n-2)
?
Mediante el uso de memoization la complejidad del tiempo se reduce a O (n), pero no es que sólo es posible si fib(n-1)
se ejecuta antes fib(n-2)
(a los valores almacenados luego usar)?
* public int fib(int n)
Es un método que calcula el número de Fibonacci enésima utilizando la recursividad.
Java garantiza que el orden de evaluación de las sub-expresiones en una expresión es de izquierda a derecha.
Las garantías lenguaje de programación Java que los operandos de los operadores parecen ser evaluado en un determinado orden de evaluación , es decir, de izquierda a derecha.
Esto significa que fib(n-1)
serán evaluados antes fib(n-2)
.
Pero el orden de evaluación no cambia la complejidad de memoization aquí, todavía es O (n) de cualquier manera. Como Java evalúa, fib(n-1)
completarán todos los valores de notas a través n-1
, incluyendo el valor de fib(n-2)
. El llamado a fib(n-2)
no hacer ningún trabajo; sólo se hace referencia al valor fib(n-1)
ya calculado.
Si se invirtió el orden en el código:
fib(n-2) + fib(n-1)
Entonces fib(n-2)
sería llamado en primer lugar, que completaría todos los valores de notas a través n-2
. A continuación, la llamada a la fib(n-1)
usaría los valores existentes memoized a "terminar el trabajo" de completar todos los valores a través fib(n-1)
.
De cualquier manera, después de evaluar estas expresiones, a través de todos los valores n-1
están memoized, con un (peor caso) Tiempo de complejidad (y la complejidad del espacio) de O (n). Además de suponer que esto es el resultado de la llamada fib(n)
, lo que, además, el valor de memoize n
.