3.3 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5cd9a70215d3c4e65518328f | Usar recursão para criar uma contagem regressiva | 1 | 305925 | use-recursion-to-create-a-countdown |
--description--
Em um desafio anterior, você aprendeu como usar recursividade para substituir laços for
. Agora, vamos analisar uma função mais complexa, a qual retorna um array de inteiros consecutivos começando com 1
até o número passado para a função.
Como mencionado no desafio anterior, haverá um caso base. O caso base diz a função recursiva quando ela não precisa mais chamar a si. É um simples caso onde o valor de retorno já é conhecido. Também haverá uma chamada recursiva a qual executa a função original com argumentos diferentes. Se a função for escrita corretamente, eventualmente o caso base será alcançado.
Por exemplo, vamos dizer que você quer escrever uma função recursiva que retorna um array contendo os números de 1
até n
. Essa função precisará aceitar um argumento, n
, representando o número final. Então ela precisará chamar a si mesmo como valores progressivamente menores de n
até que alcance 1
. Você poderia escrever a função da seguinte forma:
function countup(n) {
if (n < 1) {
return [];
} else {
const countArray = countup(n - 1);
countArray.push(n);
return countArray;
}
}
console.log(countup(5));
O valor [1, 2, 3, 4, 5]
será exibido no console.
Inicialmente, isso se parece contra-intuitivo já que o valor de n
diminui, mas os valores no array final estão em ordem crescente. Isso acontece porque a adição no array (push) acontece por último, após a chamada recursiva ter retornado. No ponto onde n
é adicionado ao array, countup(n - 1)
já foi avaliado e retornou [1, 2, ..., n -1]
.
--instructions--
Definimos uma função chamada countdown
com um parâmetro (n
). A função deve usar recursividade para retornar um array contendo inteiros n
até 1
baseado no parâmetro n
. Se a função é chamada com um número menor que 1, a função deve retornar um array vazio. Por exemplo, chamando essa função com n = 5
deve retornar o array [5, 4, 3, 2, 1]
. Sua função precisa usar recursividade ao chamar ela mesma e não deve usar laços de qualquer tipo.
--hints--
countdown(-1)
deve retornar um array vazio.
assert.isEmpty(countdown(-1));
countdown(10)
deve retornar [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)
deve retornar [5, 4, 3, 2, 1]
assert.deepStrictEqual(countdown(5), [5, 4, 3, 2, 1]);
Seu código não deve depender de nenhum tipo de laço (for
, while
ou outras funções superiores como forEach
, map
, filter
e reduce
).
assert(
!code.match(/for|while|forEach|map|filter|reduce/g)
);
Você deve usar recursividade para resolver esse 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));
}