Files
Evgeny Klimenchenko db369fbed1 fix(client): remove JS comments from user code for tests (#41873)
* Removes comments in js challanges by default

* fix local-scope-and-functions test regex

* fix all languages

* revert language changes

* removed unnecessary removeJSComments from challenges

* fix challanges in other languages

* removed removeJSComments from all challanges
2021-04-28 10:18:54 -05:00

3.4 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5cd9a70215d3c4e65518328f Utiliza recursión para crear una cuenta regresiva 1 305925 use-recursion-to-create-a-countdown

--description--

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:

function countup(n) {
  if (n < 1) {
    return [];
  } else {
    const countArray = countup(n - 1);
    countArray.push(n);
    return countArray;
  }
}
console.log(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].

--instructions--

Hemos definido una función llamada countdown con un parámetro (n). La función debe usar recursión para devolver un arreglo conteniendo los n enteros hasta 1 basado en el parámetro n. Si la función es llamada con un número menor a 1, la función debe devolver un arreglo vacío. Por ejemplo, llamar esta función con n = 5 debe devolver el arreglo [5, 4, 3, 2, 1]. Tu función debe usar recursión llamándose a sí misma y no debe usar bucles de ningún tipo.

--hints--

countdown(-1) debe devolver un arreglo vacío.

assert.isEmpty(countdown(-1));

countdown(10) debe devolver [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

assert.deepStrictEqual(countdown(10), [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]);

countdown(5) debe devolver [5, 4, 3, 2, 1]

assert.deepStrictEqual(countdown(5), [5, 4, 3, 2, 1]);

Tu código no debe depender de ningún tipo de bucles (for, while o funciones de orden alto tales como forEach, map, filter, y reduce).

assert(
  !code.match(/for|while|forEach|map|filter|reduce/g)
);

Debes usar recursión para resolver este problema.

assert(
  countdown.toString().match(/countdown\s*\(.+\)/)
);

--seed--

--seed-contents--

// Only change code below this line
function countdown(n){
  return;
}
// Only change code above this line

--solutions--

function countdown(n){
   return n < 1 ? [] : [n].concat(countdown(n - 1));
}