Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

344
Views
¿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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!