Orden de ejecución en una llamada recursiva

David:

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.

rgettman:

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-1está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.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=316668&siteId=1
Recomendado
Clasificación