1
votes

Compter les palindromes en utilisant la récursivité

J'ai actuellement un code qui compte les palindromes dans une chaîne donnée et cela fonctionnait bien jusqu'à ce que je le teste avec "appal" la fonction retournait 0 quand elle devrait renvoyer 2 (appa et pp) J'apprécierais vraiment que quelqu'un puisse éditer mon code actuel pour qu'il réponde à cette exigence, merci! Voici mon code:

function countPalindromes(string, count) {
  if (string.length <= 1) {
    return count;
  }

  let [ firstLetter ] = string;
  let lastLetter = string[string.length - 1];

  if (firstLetter === lastLetter) {
    let stringWithoutFirstAndLastLetters = string.substring(1, string.length - 1);
    return countPalindromes(stringWithoutFirstAndLastLetters, count + 1);
  } else {
    return 0;
  }
}

console.log(countPalindromes("kayak", 0));
console.log(countPalindromes("aya", 0));
console.log(countPalindromes("appal", 0));


6 commentaires

Je pense que votre problème est que vous ne vérifieriez jamais si appal et ppa sont des palindromes. Vous devrez trouver un moyen de vérifier la chaîne sans SEULEMENT la première lettre et la chaîne sans SEULEMENT la dernière lettre.


@ M-Chen-3 pensez-vous que vous pourriez m'aider avec ça?


xyzappa devrait- xyzappa également renvoyer 2 parce que appa et pp sont des palindromes? Comment cela est-il censé fonctionner exactement?


oui qui devrait renvoyer 2 aussi, mes affectations me demandent de "Étant donné une chaîne, calculer le nombre de palindromes qui existent dans cette chaîne (lettres uniques exclues), tout en utilisant la récursivité" @Sylwester


@Sylwester J'apprécierais vraiment votre aide !!


Si vous cliquez sur la balise palindrome en bas de votre question, vous verrez qu'il y a 1426 questions déjà posées sur les palindromes sur Stack Overflow. Aucun de ceux-ci n'a répondu à votre question?


3 Réponses :


0
votes

function isPalindrome(str) {
  return str == str.split("").reverse().join("");
}
//iterative only solution
function countPalindromes(s) {
  let count = 0;
  for (let i = 0; i < s.length - 1; i++) {
    const sub = s.slice(i);

    for (let j = 2; j < sub.length + 1; j++) {
      if (isPalindrome(sub.slice(0, j))) {
        count++
      }
    }
  }
  return count;
}

console.log(countPalindromes("kayak"));
console.log(countPalindromes("aya"));
console.log(countPalindromes("appal"));

Vous comparez la première lettre avec la dernière lettre et vous renverrez zéro car ce sera faux pour appal mais vrai pour les 2 autres cas de test.


5 commentaires

pourriez-vous m'aider à résoudre ce problème s'il vous plaît? @candaceahrends


Voici une question similaire: stackoverflow.com/questions/64596115/...


cette question parle de l'implémentation d'une fonction itérative et elle a le même problème où appal renvoie 0 au lieu de 2 @candaceahrends


mes affectations me demandent de "Étant donné une chaîne, calculer le nombre de palindromes qui existent dans cette chaîne (lettres simples exclues), tout en utilisant la récursivité" @CanadaceAhrends


s'il vous plaît aidez-moi, je l'apprécierais vraiment



0
votes

Je pense que cette fonction fait l'affaire. Heureux de refactoriser et de l'expliquer plus tard. Je préfère écrire une nouvelle fonction car je ne pense pas que votre code soit proche de l'exécution de la tâche.

function returnNumberOfPalindromes(word) {
    function isPalindrome(chunk) { 
        return [...chunk].reverse().join('') === chunk;
    }
    let tally = 0;
  
    for (let index1 = 0; index1 <= word.length; index1++) {
      for (index2 = index1 + 2; index2 <= word.length; index2++) { 
        let chunk = word.slice(index1, index2); 
        if (isPalindrome(chunk)) {
            tally += 1;
        };
      }
    }
    console.log(tally);
}

returnNumberOfPalindromes("kayak");
returnNumberOfPalindromes("aya");
returnNumberOfPalindromes("appal");
returnNumberOfPalindromes("addadaadd");


4 commentaires

avez-vous une idée de la façon dont je peux coder la même chose à partir d'une approche itérative? @ tonitone120


@ 28spaceaddict Je comprends que le mot itératif signifie «répéter» - par exemple, une for loop . (Par cette définition, je dirais que ma réponse est une approche itérative). Pouvez-vous donner un exemple de ce que vous entendez par approche itérative? Je dois y aller maintenant mais je reviendrai plus tard


oui, c'est une approche itérative, j'ai donc besoin du même code avec une approche itérative et aussi en utilisant la récursivité @ tonitone120


pensez-vous que vous serez de retour dans 20 minutes parce que je dois le soumettre dans 40 minutes?



0
votes
  1. Donc, fondamentalement, si vous trouvez un palindrome comme pp ou apa en scannant la chaîne et en comparant le current avec le current+1 et le current+2 dans une boucle itérative et en stockant les correspondances sous forme d'objets avec un index de fin de début.

  2. Vous lancez un décompte qui correspond à la longueur du tableau.

  3. Mettez à jour le tableau en filtrant les éléments où vous mettez à jour l'objet avec un de moins et un de plus pour début fin si le 1 plus grand est un palindrome et retournez vrai ou retournez faux et faites-le supprimer.

  4. si le tableau est de longueur zéro, vous renvoyez le compte

  5. ajoutez la longueur du tableau au nombre et répétez à partir de 3.


2 commentaires

pouvez-vous me montrer comment faire cela s'il vous plaît @sylwester


@ 28spaceaddict Puisque ce sont certainement des devoirs, je ne le ferai pas. Vous devez écrire votre propre code. Ma réponse décrit simplement comment je l'aurais fait. Si vous lisez ceci et le faites manuellement sur papier, voyez-vous des faiblesses?