Artigo original: https://www.freecodecamp.org/news/three-ways-to-repeat-a-string-in-javascript-2a9053b93a2d/

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:

  1. com um laço while
  2. com recursão
  3. com o método repeat(), da ES6

Descrição do desafio de algoritmo

Repita uma string passada str (primeiro argumento), num vezes (segundo argumento). Retorne uma string vazia se num nã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‬!

Recursos adicionais