Sus dos algoritmos son equivalentes (al menos para los enteros positivos, lo que sucede con los enteros negativos en la versión imperativa depende de la semántica de Java para la %
que no sé de memoria). En la versión recursiva, deje que y sean el argumento de la ésima llamada recursiva:
unayosiyoyo
unai + 1=byosii + 1=ayom o d byo
En la versión imperativa, dejemos que y sean los valores de las variables y al comienzo de la ésima iteración del bucle.
una′yosi′yoa
b
yo
una′i + 1= b′yosi′i + 1= a′yom o d b′yo
¿Notas un parecido? Su versión imperativa y su versión recursiva están calculando exactamente los mismos valores. Además, ambos terminan al mismo tiempo, cuando (resp. ), por lo que realizan el mismo número de iteraciones. Hablando algorítmicamente, no hay diferencia entre los dos. Cualquier diferencia será una cuestión de implementación, altamente dependiente del compilador, el hardware en el que se ejecuta, y posiblemente el sistema operativo y los otros programas que se ejecutan simultáneamente.unayo= 0una′yo= 0
La versión recursiva solo realiza llamadas recursivas de cola . La mayoría de los compiladores para lenguajes imperativos no los optimizan, por lo que es probable que el código que generan desperdicie un poco de tiempo y memoria construyendo un marco de pila en cada iteración. Con un compilador que optimiza las llamadas de cola (los compiladores para lenguajes funcionales casi siempre lo hacen), el código de máquina generado puede ser el mismo para ambos (suponiendo que armonice esas llamadas abs
).