0% encontró este documento útil (0 votos)
16 vistas6 páginas

Reemplazo de bucles por recursión en JS

El documento explica cómo reemplazar bucles con recursión en funciones, ilustrando ejemplos como la multiplicación de elementos de un arreglo y la creación de una cuenta regresiva. También se aborda la función rangeOfNumbers que genera un arreglo de números consecutivos utilizando recursión. Además, se compara el alcance de las variables declaradas con 'var' y 'let', destacando las diferencias en su comportamiento dentro de funciones y bloques.

Cargado por

Hernán Camusso
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
16 vistas6 páginas

Reemplazo de bucles por recursión en JS

El documento explica cómo reemplazar bucles con recursión en funciones, ilustrando ejemplos como la multiplicación de elementos de un arreglo y la creación de una cuenta regresiva. También se aborda la función rangeOfNumbers que genera un arreglo de números consecutivos utilizando recursión. Además, se compara el alcance de las variables declaradas con 'var' y 'let', destacando las diferencias en su comportamiento dentro de funciones y bloques.

Cargado por

Hernán Camusso
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como DOCX, PDF, TXT o lee en línea desde Scribd

Reemplaza bucles usando recursión

La recursión es el concepto que una función puede expresarse en


términos de sí misma. Para ayudar a comprender esto, comienza
pensando en la siguiente tarea: multiplica los primeros n elementos
de un arreglo para crear el producto de esos elementos. Usando un
bucle for, puedes hacer esto:
function multiply(arr, n) {
let product = 1;
for (let i = 0; i < n; i++) {
product *= arr[i];
}
return product;
}

Sin embargo, nota que multiply(arr, n) == multiply(arr, n - 1) *


arr[n - 1]. Esto significa que puedes reescribir multiply en
términos de sí misma y que nunca necesites hacer uso de un bucle.
function multiply(arr, n) {
if (n <= 0) {
return 1;
} else {
return multiply(arr, n - 1) * arr[n - 1];
}
}

La versión recursiva de multiply se desglosa así. En el caso base,


donde n <= 0, devuelve 1. Para valores más grandes de n, se llama
a sí misma, pero con n - 1. Esa llamada de función se evalúa de la
misma manera, llamando a multiply otra vez hasta que n <= 0. En
este punto, todas las funciones pueden devolver y la multiply
original devuelve la respuesta.
Nota: Las funciones recursivas deben tener un caso base cuando
devuelven sin tener que llamar a la función de nuevo (en este
ejemplo, cuando n <= 0), de lo contrario nunca podrán terminar de
ejecutarse.
Utiliza recursión para crear una cuenta regresiva
En el desafío anterior, aprendiste como usar la recursión para
reemplazar un bucle for. Ahora, echemos un vistazo a una función
más compleja que devuelve un arreglo de enteros consecutivos
empezando con 1 hasta el número pasado a la función.
Como se menciona en el desafío anterior, habrá un caso base. El
caso base le dice a la función recursiva cuando no necesita llamarse
a sí misma. Es un caso simple donde el valor de retorno ya se
conoce. También habrá una llamada recursiva la cual ejecuta la
función original con argumentos diferentes. Si la función se escribe
correctamente, eventualmente el caso base será alcanzado.
Por ejemplo, digamos que quieres escribir una función recursiva que
devuelva un arreglo conteniendo los números 1 hasta n. Esta función
necesitará aceptar un argumento, n que representa el número final.
Entonces necesitará llamarse a sí misma con valores
progresivamente más pequeños de n hasta que alcance 1. Podrías
escribir la función de la siguiente manera:
var countArray=[];
function countup(n) {
if (n < 1) {
return [];
} else {
countArray = countup(n - 1);
[Link](n);
}
return countArray;
}
[Link](countup(5));

El valor [1, 2, 3, 4, 5] se mostrará en la consola.


Al principio, esto parece contraintuitivo ya que el valor de n
disminuye, pero los valores en el arreglo final se están
incrementando. Esto sucede porque la inserción ocurre al último,
después de la llamada recursiva. En el punto donde n es empujado
en el arreglo, countup(n - 1) ya ha sido evaluada y devuelto [1,
2, ..., n - 1].

Usa recursión para crear un rango de números


Continuando con el desafío anterior, te ofrecemos otra oportunidad
de crear una función recursiva para resolver un problema.

Hemos definido una función llamada rangeOfNumbers con dos


parámetros. La función debe devolver un arreglo de enteros que
comienza con el número representado por el parámetro startNum y
termina con el número representado por el parámetro endNum. El
número inicial será siempre menor o igual que el número final. Tu
función debe utilizar recursión, llamándose a sí misma, y no utilizar
bucles de ningún tipo. También debe funcionar en el caso que
startNum y endNum sean iguales.

var array =[];


function rangeOfNumbers(startNum, endNum) {
if (startNum > endNum) {
return [];
} else {
array = rangeOfNumbers(startNum+1,endNum);
[Link](startNum);
}
return array;
};
[Link](rangeOfNumbers(2,5))

Compara el alcance de las palabras clave "var" y "let"


Si no estás familiarizado con let, echa un vistazo a este desafío.
Cuando declaras una variable con la palabra clave var, esta es
declarada globalmente o localmente sí es declarada dentro de una
función.
La palabra clave let se comporta de forma similar, pero con algunas
características adicionales. Cuanto declaras una variable con la
palabra clave let dentro de un bloque, una declaración o expresión.
Su alcance está limitado a ese bloque, declaración o expresión.
Por ejemplo:
var numArray = [];
for (var i = 0; i < 3; i++) {
[Link](i);
}
[Link](numArray);
[Link](i);

Aquí la consola mostrará los valores [0, 1, 2] y 3.


Con la palabra clave var, i es declarada globalmente. Así, cuando i+
+ es ejecutado, la variable global es actualizada. Este código es
similar al siguiente:
var numArray = [];
var i;
for (i = 0; i < 3; i++) {
[Link](i);
}
[Link](numArray);
[Link](i);
Aquí la consola mostrará los valores [0, 1, 2] y 3.
Este comportamiento causará problemas si creas una función y la
almacenas para su uso posterior dentro de un bucle for que usa la
variable i. Esto se debe a que la función almacenada siempre se
referirá al valor de la variable global i actualizada.
var printNumTwo;
for (var i = 0; i < 3; i++) {
if (i === 2) {
printNumTwo = function() {
return i;
};
}
}
[Link](printNumTwo());

Aquí la consola mostrará el valor 3.


Como puedes ver, printNumTwo() imprime 3 y no 2. Esto es porque el
valor asignado a i fue actualizado y la función printNumTwo()
devuelve el global de i y no el valor que tenía i cuando la función
fue creada en el bucle for. La palabra clave let no sigue este
comportamiento:
let printNumTwo;
for (let i = 0; i < 3; i++) {
if (i === 2) {
printNumTwo = function() {
return i;
};
}
}
[Link](printNumTwo());
[Link](i);

Aquí la consola mostrará el valor 2 y el error que i is not defined.


i no está definida, porque no ha sido declarada en el ámbito global.
Solo ha sido declarada dentro de la sentencia de bucle for.
printNumTwo() devolvió el valor correcto, porque tres variables
diferentes de i con valores únicos (0, 1 y 2) fueron creadas por la
palabra clave let dentro de la sentencia del bucle.

En el sig codigo la variable i, declarada en la sentencia if es una


variable separada de la variable i, declarada en la primera línea de
la función.
function checkScope() {
let i = 'function scope';
if (true) {
let i = 'block scope';
[Link]('Block scope i is: ', i);
}
[Link]('Function scope i is: ', i);
return i;
}
Cuando programas una función similar a la que es usada en este
ejercicio, es a menudo mejor usar diferentes nombres de variables
para evitar confusión.

También podría gustarte