Soy bastante nuevo en programación y estoy aprendiendo sobre recursividad básica por primera vez. Un resultado que obtuve jugando con una pregunta de práctica en JavaScript es realmente hornear mis fideos.
function countDownRecursive(n) { if (n == 0) { console.log('Hooray!') return } else { console.log(n) countDownRecursive(n-1) console.log(n) } }La salida de ie, countDownRecursive(3) es
3 2 1 ¡Hurra! 1 2 3
Mi pregunta es ¿por qué poner console.log() después de countDownRecursive(n-1) como este hace que JS registre los valores al revés?
En la llamada inicial, se ingresa el else y
console.log(n) countDownRecursive(n-1) 3 está registrado. Luego, la función inicial countDownRecursive(3) se suspende mientras se llama a countDownRecursive(3-1) . La pila ahora está compuesta por countDownRecursive(3) .
Lo mismo sucede con countDownRecursive(2) . 2 está registrado y, con su llamada recursiva, la pila ahora se compone de countDownRecursive(2) y countDownRecursive(3) .
Y así. Al final, con countDownRecursive(0) , la pila es
countDownRecursive(0) <-- current function countDownRecursive(1) countDownRecursive(2) countDownRecursive(3) y 3 2 1 ha sido registrado.
En 0, no hay más recursividad, así que Hooray ! Ese countDownRecursive(0) más interno finaliza, y luego el countDownRecursive(1) reanuda en el punto en el punto de la llamada recursiva:
countDownRecursive(1-1) // this line just finished console.log(1)entonces 1 se registra y esa función finaliza.
Las funciones se siguen reanudando, registrando y saliendo, hasta que la pila está vacía y te quedan registros de
3 2 1 Hooray! 1 2 3