acabo de empezar a aprender javascript y me encontré con este código mientras aprendía recursividad, ¿podría alguien explicarme por qué el resultado es [1,2,3,4,5]?
function rangeOfNumbers(startNum, endNum) { if (endNum - startNum === 0) { return [startNum]; } else { var numbers = rangeOfNumbers(startNum, endNum - 1); numbers.push(endNum); return numbers; } } console.log(rangeOfNumbers(1,5))Parece que no puedo entender esta línea de código "var números = rangeOfNumbers (startNum, endNum - 1);"
Todo lo que sé es que se vuelve a llamar a sí mismo mientras resta 1 en endNum cada llamada y lo empuja a la matriz de numbers
Escribí algunos comentarios a las líneas para que puedas captar el propósito funcional de cada uno, si necesitas una comprensión más profunda de lo que sucede, intenta usar la herramienta de depuración de tu IDE (vscode, por ejemplo).
Allí verá que ingresará a la declaración else, llamará a la función de forma recursiva, saltará nuevamente a else y recursividad hasta que llegue al final definido en el primer if , luego habrá terminado de llamar a la recursividad y el estado recursivo everz llamará al siguiente línea donde presiona el número y luego regresa al siguiente estado de recurrencia superior.
Así que el recorrido con 1,3:
3 > 1, => recurse a 2>1, => recurse a 1=1, rompa la recursividad, empuje 1, salga, empuje 2, salga, empuje 3, entonces ya está
function rangeOfNumbers(startNum, endNum) { if (endNum - startNum === 0) { // This statement checks if the recursion has hit its end when endNum === startNum return [startNum]; // This is the point when the recursion is stopped } else { var numbers = rangeOfNumbers(startNum, endNum - 1); // If the recursion is not finished yet, the function will call itself with the reduced endNum numbers.push(endNum); // This is first called in the deepest recursion, so the first one to be added is 1, then it steps back to the recursion state one above and in this case adds the 2 to the array return numbers; // Finally we return to be done with the function } } console.log(rangeOfNumbers(1,5)) // This is the start, the function is called with the 2 parameters 1 and 5Agregar registros lo ayudará a visualizar lo que sucede en el código. Te mostrará cómo se hacen las llamadas y con qué parámetros. Nota: el registro de Stackoverflow no tiene sangría, por lo que es mejor mirar la consola del navegador para verlo.
function rangeOfNumbers(startNum, endNum) { console.group("rangeOfNumbers called with ", startNum, endNum); console.log("Subtraction = ", endNum - startNum); if (endNum - startNum === 0) { // did we hit the end point? console.log("We got zero. Returning ", startNum); console.groupEnd(); return [startNum]; } else { // numbers are different console.log("Calling rangeOfNumbers inside of else"); var numbers = rangeOfNumbers(startNum, endNum - 1); // Make a new call with end number reduced by one console.log("rangeOfNumbers call returned", numbers.join(", ")); numbers.push(endNum); console.log("pushing ", endNum); console.log("numbers updated with", numbers.join(", ")); console.groupEnd(); return numbers; } } console.log(rangeOfNumbers(1,5))Supongamos (por ahora) que rangeOfNumbers(a,b) produce la lista de números de a a b (inclusive).
Ahora, la parte sobre la que preguntó específicamente tiene sentido: para obtener la lista de números desde startNum hasta endNum (inclusive):
startNum hasta endNum pero sin incluirlo.endNum al final de esa lista Eso deja nuestra suposición molesta: nuestra función solo funciona si funciona para un rango más corto . Y aquí es donde entra en juego el if : si la lista solo contiene un único valor, devolver una lista de solo ese valor, sin hacer una llamada recursiva (lo que obviamente debería ser correcto).
Lo que significa:
if )Lo que significa que funciona para cualquier valor de N que pueda representar la longitud de una lista.