Artigo original: Three ways to repeat a string in JavaScript
Neste artigo, explicarei como resolver o desafio "Repetir uma string" do freeCodeCamp. Isso envolve repetir uma string um certo número de vezes.
Abordarei o tema usando três possibilidades:
- com um laço while
- com recursão
- com o método repeat(), da ES6
Descrição do desafio de algoritmo
Repita uma string passadastr(primeiro argumento),numvezes (segundo argumento). Retorne uma string vazia senumnão for um número positivo.
function repeatStringNumTimes(str, num) {
return str;
}
repeatStringNumTimes("abc", 3);Casos de testes fornecidos
repeatStringNumTimes("*", 3) deve retornar "***".
repeatStringNumTimes("abc", 3) deve retornar "abcabcabc".
repeatStringNumTimes("abc", 4) deve retornar "abcabcabcabc".
repeatStringNumTimes("abc", 1) deve retornar "abc".
repeatStringNumTimes("*", 8) deve retornar "********".
repeatStringNumTimes("abc", -2) deve retornar "".Abordagem nº 1: repetir uma string com um laço while
Uma instrução while executa um bloco de instruções desde que uma condição especificada seja avaliada como true.
Uma instrução while tem esta aparência:
while (condição) {
bloco de instruções
}A condição é avaliada antes de cada passagem pelo laço. Se a condição for true, o bloco de instruções será executado. Se a condição for false, a execução continuará a partir do final do laço while.
As instruções dentro do laço são executadas enquanto a condição for true (verdadeira). Esta é a solução:
function repeatStringNumTimes(string, times) {
// Passo 1. Crie uma string vazia que conterá a string a ser repetida
var repeatedString = "";
// Passo 2. Defina o laço while com (times > 0) como sendo a condição a ser verificada
while (times > 0) { // Enquanto times for maior do que 0, a instrução será executada
// A instrução
repeatedString += string; // O mesmo que repeatedString = repeatedString + string;
times--; // O mesmo que times = times - 1;
}
/* Lógica do laço while
Condição T/F repeatedString += string repeatedString times
Primeira iteração (3 > 0) true "" + "abc" "abc" 2
Segunda iteração (2 > 0) true "abc" + "abc" "abcabc" 1
Terceira iteração (1 > 0) true "abcabc" + "abc" "abcabcabc" 0
Quarta iteração (0 > 0) false
}
*/
// Passo 3. Retornar a string repetida
return repeatedString; // "abcabcabc"
}
repeatStringNumTimes("abc", 3);Aqui temos o algoritmo sem os comentários explicativos:
function repeatStringNumTimes(string, times) {
var repeatedString = "";
while (times > 0) {
repeatedString += string;
times--;
}
return repeatedString;
}
repeatStringNumTimes("abc", 3);Abordagem nº 2: repetir uma string usando um condicional e recursão
Recursão é uma técnica para iterar sobre uma operação fazendo com que uma função chame a si mesma repetidamente até chegar a um resultado. Existem alguns recursos importantes da recursão que devem ser incluídos para que ela funcione corretamente:
- Primeiro, temos o caso de base: trata-se de uma instrução, geralmente dentro de uma cláusula condicional
if, que interrompe a recursão. - O segundo é o caso recursivo: esta é a instrução em que a função recursiva é chamada por ela mesma.
Aqui está a solução:
function repeatStringNumTimes(string, times) {
// Passo 1. Verificar se times é negativo e retornar uma string se isso for verdade
if (times < 0) {
return "";
}
// Passo 2. Verificar se times é igual a 1 e retornar a própria string se este for o caso.
if (times === 1) {
return string;
}
// Passo 3. Usar recursão
else {
return string + repeatStringNumTimes(string, times - 1); // retornar "abcabcabc";
}
/*
Primeira parte do método de recursão
Você precisa se lembrar de que não deseja apenas uma chamada, terá várias chamadas aninhadas
times string + repeatStringNumTimes(string, times - 1)
Primeira chamada 3 "abc" + ("abc", 3 - 1)
Segunda chamada 2 "abc" + ("abc", 2 - 1)
Terceira chamada 1 "abc" => if (times === 1) return string;
Quarta chamada 0 "" => if (times <= 0) return "";
Segunda parte do método de recursão
a quarta chamada retornará ""
a terceira chamada retornará "abc"
a segunda chamada retornará "abc"
a primeira chamada retornará "abc"
A chamada final é uma concatenação de todas as strings
return "abc" + "abc" + "abc"; // retornar "abcabcabc";
*/
}
repeatStringNumTimes("abc", 3);Aqui temos a solução novamente, sem os comentários:
function repeatStringNumTimes(string, times) {
if(times < 0)
return "";
if(times === 1)
return string;
else
return string + repeatStringNumTimes(string, times - 1);
}
repeatStringNumTimes("abc", 3);Abordagem nº 3: repetir uma string usando o método repeat() da ES6
Para essa solução, você usará o método String.prototype.repeat():
- O método
repeat()constrói e retorna uma nova string que contém o número especificado de cópias da string na qual ele foi chamado, concatenadas umas com as outras.
Aqui está a solução:
function repeatStringNumTimes(string, times) {
//Passo 1. Se times for positivo, retornar a string repetida
if (times > 0) { // (3 > 0) => true
return string.repeat(times); // retorna "abc".repeat(3); => retorna "abcabcabc";
}
//Passo 2. Do contrário, se times for negativo, retorne uma string vazia se for true
else {
return "";
}
}
repeatStringNumTimes("abc", 3);Aqui temos a solução novamente, sem os comentários:
function repeatStringNumTimes(string, times) {
if (times > 0)
return string.repeat(times);
else
return "";
}
repeatStringNumTimes("abc", 3);Você pode usar um operador ternário como um atalho para a instrução if/else, assim:
times > 0 ? string.repeat(times) : "";Podemos ler isso deste modo:
if (times > 0) {
return string.repeat(times);
} else {
return "";
}Você pode então retornar o operador ternário em sua função:
Espero que você tenha achado este artigo útil. Ele faz parte da minha série de artigos "Como resolver algoritmos do freeCodeCamp", onde proponho várias soluções e explico passo a passo o que acontece nos algoritmos internamente.
Três maneiras de inverter uma string em JavaScript
Três maneiras de encontrar o fatorial de um número em JavaScript
Duas maneiras de conferir palíndromos em JavaScript
Três maneiras de encontrar a maior palavra em uma string em JavaScript
Três maneiras de capitalizar a primeira letra de cada palavra de uma frase em JavaScript
Duas maneiras de confirmar o final de uma string em JavaScript (em inglês)
Se quiser, você pode seguir a autora no Medium, Twitter, Github e LinkedIn.
#StayCurious, #KeepOnHacking, #MakeItHappen!