Es contrario a la intuición por qué esta función recursiva cuenta tanto hacia atrás como hacia arriba. ¿Alguien puede explicarlo?
function counter(value, limit) { if (value === limit) { console.log(value); } else { console.log('going up:', value); // on the way down / going deeper (increment) counter(value + 1, limit); console.log('going down:', value); // on the way up / coming up from the depths (decrement) } } counter(0, 3); Noté que cuando agrego un setTimeOut() , genera los valores previos y posteriores juntos en lugar de uno arriba y otro abajo.
going up: 0 going down: 0 2022-03-07T14:33:38.701Z going up: 1 going down: 1 2022-03-07T14:33:39.213Z going up: 2 going down: 2 2022-03-07T14:33:39.726Z 3Esto podría ayudar:
¿Qué pasa si comenzamos con esta versión en su lugar?
function counter(value, limit) { if (value === limit) { console.log(value); } else { console.log('going up:', value); console .log ('*** Do some more stuff ***'); console.log('going down:', value); } } counter(0, 3);Entonces obtendríamos esta salida:
going up: 0 *** Do some more stuff *** going down: 0 Ahora, reemplacemos ese hacer-más-cosas con el resultado de llamar a counter (value + 1, limit) , que es counter (1, 3) , cuyo resultado sería:
going up: 1 *** Do some more stuff *** going down: 1Sustituyendo eso, obtenemos:
going up: 0 going up: 1 *** Do some more stuff *** going down: 1 going down: 0haciendo otro nivel, llamaríamos al contador (2, 3) para obtener
going up: 2 *** Do some more stuff *** going down: 2y reemplazando eso en lo anterior, obtenemos
going up: 0 going up: 1 going up: 2 *** Do some more stuff *** going down: 2 going down: 1 going down: 0 Pero ahora llamamos al counter (3, 3) y el resultado es que simplemente registramos el valor:
3Sustituyendo eso, obtenemos
going up: 0 going up: 1 going up: 2 3 going down: 2 going down: 1 going down: 0Por supuesto, en tiempo de ejecución no existen tales sustituciones reales. Pero podemos pensar en la llamada recursiva como algo que se atasca entre "subir" y "bajar", y cualquier resultado se colocará entre esos dos.