Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

345
Vistas
¿Podría explicarme esta función de recursión de freecodecamp, por favor?

aquí está el código

 function rangeOfNumbers(startNum, endNum) { return startNum === endNum ? [startNum] : rangeOfNumbers(startNum, endNum - 1).concat(endNum); }

Entiendo que hasta que startNum igual a endNum , se recordará a sí mismo, pero lo que no entiendo es dónde se almacena el valor.

Digamos, por ejemplo, que es rangeOfNumbers(3,6) Así que será así:

 6-1 5-1 4-1

¿Derecha? Y cada vez que se agregan los números a la matriz, obtenemos [3,4,5,6] , pero no entiendo cómo y dónde almacena esta matriz.

Si no me equivoco, concat fusiona dos o más arreglos, pero no hay arreglos.

Sólo quiero tener una comprensión completa de ello. De lo contrario, no lo recordaré y no podré usarlo.

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

Tan pronto como se cumple la condición de ruptura ( startNum === endNum ), se devuelve una matriz ( [startNum] ). Dicho objeto tiene una función concat que genera otra matriz y así sucesivamente hasta la primera llamada.

En resumen: la matriz comienza en la condición de interrupción y endNum se concatena en cada valor de retorno, que nuevamente es una matriz.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Cuando se ingresa un bloque (algo que comienza con { y contiene declaraciones), se crea un nuevo "entorno variable" . Podría pensar en esto como algo que asigna cada identificador para la ejecución de ese bloque a su valor.

Cada vez que se llama a una función, se crea un nuevo entorno de este tipo.

En este caso, los parámetros startNum y endNum se almacenan en un entorno la primera vez que se llama a la función. Entonces, cuando el intérprete se encuentra con

 rangeOfNumbers(startNum, endNum - 1).concat(endNum);

La función que se está ejecutando actualmente (la que está vinculada al entorno que se acaba de describir) se suspende y se coloca una nueva función en la pila de llamadas, creando otro entorno. El proceso se repite hasta que se alcanza el final de la lógica recursiva y se [startNum] (o se explota la pila). En ese momento, tiene un montón de funciones rangeOfNumbers en progreso, cada una con sus propios entornos. En ese momento, podrías imaginarlo como algo así como

 rangeOfNumbers { startNum: 3, endNum: 5 } (this is the intial call; currently suspended) rangeOfNumbers { startNum: 4, endNum: 5 } (currently suspended) rangeOfNumbers { startNum: 5, endNum: 5 } (executing, about to return)

La función más interna devuelve su [startNum] y termina, y así se reanuda la última función, ahora con el valor de retorno utilizable:

 : rangeOfNumbers(startNum, endNum - 1).concat(endNum);

se evalúa, cuando endNum es 5:

 : [5].concat(endNum);

El proceso continúa en la pila hasta que finalizan todas las llamadas recursivas y solo tiene la inicial

 rangeOfNumbers { startNum: 3, endNum: 5 }

que luego se acaba solo.

Entonces, mientras se realizan las llamadas recursivas, los valores de las llamadas anteriores se almacenan en cada uno de los entornos de esas llamadas.

Si no me equivoco, concat fusiona dos o más arreglos, pero no hay arreglos.

[startNum] es una matriz devuelta en el punto más interno de la recursividad. concat también puede crear una nueva matriz tomando una matriz como argumento y el valor para agregar como otro. Por ejemplo, [5].concat(4) se evalúa como [5, 4] .

about 4 years ago · Juan Pablo Isaza Denunciar

0

Si no me equivoco, concat fusiona dos o más arreglos, pero no hay arreglos .

Tienes toda la razón en esto. endNum no es una matriz. Sin embargo, si lee más abajo en los documentos, el argumento proporcionado para concat puede ser una matriz o valor(es).

Parámetros

valueN Opcional

Matrices y/o valores para concatenar en una nueva matriz. Si se omiten todos los parámetros valueN, concat devuelve una copia superficial de la matriz existente en la que se llama. Consulte la descripción a continuación para obtener más detalles.

Las funciones de Javascript son variadas por diseño, por lo que parece que el método concat aprovecha esto para aceptar argumentos individuales para agregarlos a una copia de la matriz existente.


Entiendo que hasta que startNum sea igual a endNum, se recordará a sí mismo, pero lo que no entiendo es dónde se almacena el valor.

Puede ayudar si escribe la función usando nombres de variables explícitos

 function rangeOfNumbers(startNum, endNum) { if (startNum === endNum) { return [startNum]; } const currentRange = rangeOfNumbers(startNum, endNum - 1); return currentRange.concat(endNum); }

Como puede ver, el valor (o endNum ) se almacena dentro de la matriz devuelta al llamar a la función para el rango [startNum, endNum - 1] .

La parte más complicada de la recursividad radica en el hecho de que no se ve dónde se almacenan esos valores intermedios, hasta que, como por arte de magia, llegamos al caso base y ¡he aquí que tenemos una matriz!

La respuesta es que la matriz devuelta por rangeOfNumbers(startNum, endNum - 1) se mantiene en la memoria de la pila hasta que sea necesario devolverla. La discusión de stack vs heap estará bastante fuera de tema aquí, pero está bastante cubierta aquí:

¿Qué y dónde están la pila y el montón?

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda