1
votes

Compter les voyelles dans une chaîne à l'aide de la récursivité avec JavaScript

Bonjour, j'essaie de comprendre la récursivité en JavaScript.

Jusqu'à présent, j'ai:

function countVowels(string) {
    let vowelCount = 0;

    // if we're not at the end of the string,
    // and if the character in the string is a vowel

    if (string.length - 1 >= 0 && charAt(string.length -1) === "aeiouAEIOU") {

    //increase vowel count every time we iterate 

        countVowels(vowelCount++);
    }
    return vowelCount;
}

Tout d'abord, cela me pose des problèmes car charAt n'est pas défini. Sinon, comment puis-je dire "le caractère à l'index actuel" pendant l'itération?

Je ne peux pas utiliser une boucle for - je dois utiliser la récursivité.

Deuxièmement, est-ce que j'utilise correctement la récursivité ici?

countVowels (vowelCount ++);

J'essaie d'augmenter le nombre de voyelles à chaque fois que la fonction est appelée.

Merci pour vos conseils.


0 commentaires

3 Réponses :


1
votes

Vous faites deux erreurs:

  • Vous devriez avoir trois paramètres string , count (nombre de voyelles) et l'index actuel i .
  • Vous devez utiliser includes () au lieu de comparer le caractère avec "aeiouAEIOU"

"aeiou".includes('a') //checking if 'a' is present in string "aeiou"  //true

Comme demandé par OP dans les commentaires "Pouvez-vous expliquer pourquoi c'est if (" aeiou ".includes (string [i] .toLowerCase ())) au lieu de if(string[i .includes("aeiou".toLowerCase()))"

Nous devons donc d'abord savoir ce que les includes font. includes () vérifie la chaîne si elle inclut une certaine sous-chaîne qui lui est passée ou non. La chaîne sur laquelle la méthode sera utilisée sera une chaîne plus grande et la valeur transmise à includes () sera plus petite.

Mauvaise réponse.

"a".includes('aeiou') //checking if 'aeiou' is present in string "a"   //false

Corrigez-en une.

function countVowels(string,count= 0,i=0) {
    if(!string[i]) return count
    if("aeiou".includes(string[i].toLowerCase())) count++;
    return countVowels(string,count,i+1);
}
console.log(countVowels("abcde")) //2


3 commentaires

Pouvez-vous expliquer pourquoi c'est if ("aeiou" .includes (string [i] .toLowerCase ())) au lieu de if (string [i] .includes ("aeiou" .toLowerCase ())) - .includes () n'arrive-t-il pas à une valeur existante? Comme si string.includes ("dog")


string [i] est le caractère à travers lequel nous itérons. Et toujours une chaîne courte est incluse par une grande. Ici, le petit est string [i] et le grand est "aeiou" .


@ HappyHands31 pour plus d'informations, voir developer.mozilla. org / en-US / docs / Web / JavaScript / Reference /…



3
votes

Si vous êtes intéressé, voici une version qui ne garde pas la trace de l'index ou du décompte, ce qui pourrait vous éclairer davantage sur la manière dont la récursivité peut être effectuée.

function countVowels(string) {
  if (!string.length) return 0;
  return (
"aeiou".includes(string.charAt(0).toLowerCase()) +
countVowels(string.substr(1))
  );
}

console.log(countVowels("")); // 0
console.log(countVowels("abcde")); // 2
console.log(countVowels("eee")); // 3

// Note that:

console.log('"hello".substr(1)', "hello".substr(1)) // ello
console.log('"hello".charAt(0)', "hello".charAt(0)) // h
console.log('"aeiou".includes("a")', "aeiou".includes("a")) // true
console.log('"a".includes("aeiou")', "a".includes("aeiou")) // false

Notre cas de base est que la chaîne est vide, donc nous retournons 0.

Sinon, nous vérifions si le premier caractère de la chaîne est une voyelle ( true == 1 et false == 0 en javascript) et additionnez cela en comptant la chaîne suivante (plus petite d'un).


4 commentaires

Désolé mais je suis frustré d'essayer d'apprendre cela. Je m'attendrais à ce que la syntaxe de vérification de la présence ou non d'une voyelle dans la chaîne soit string [i] .includes ("aeiou" .toLowerCase ()) . Je ne comprends pas pourquoi c'est "aeiou" .includes (etc) mais d'accord. Ensuite, vous avez (string.charAt (0) .toLowerCase ()) - cela ne vérifie-t-il pas uniquement le premier caractère de la chaîne? Je ne vois pas comment l'itération dans la chaîne se produit? Enfin, je viens de rechercher la méthode .substr () et j'ai trouvé que cela extrairait une partie de la chaîne. Donc, dans ce cas, je m'attendrais à ce qu'il extrait "b" de "abcde"?


@ HappyHands31 Nous devons seulement vérifier le premier caractère car à chaque fois que nous supprimons le premier caractère et envoyons le reste à la fonction countVowels (string.substr (1))


@MaheerAli Oh donc string.substr (1) est-ce que supprime le premier caractère à chaque fois?


@ HappyHands31 J'ai ajouté quelques lignes à l'extrait afin que vous puissiez voir ces éléments en action séparément. Essayez de jouer dans la console de développement ou dans un extrait de code pour voir comment cela fonctionne.



1
votes

Une solution possible serait:

function countVowels(string, number) {
  if (!string) return number;
  return countVowels(string.slice(1), 'aeiouAEIOU'.includes(string[0])? number + 1 : number);
}

// tests
console.log('abc  --> ' +  countVowels('abc', 0));
console.log('noor --> ' + countVowels('noor', 0));
console.log('hi   --> ' + countVowels('hi', 0));
console.log('xyz  --> ' + countVowels('xyz', 0));

et vous devriez appeler votre fonction comme: countVowels ('abc', 0)

Notes sur votre solution:

  1. vous réinitialisez toujours vowelCount dans votre fonction, cela ne fonctionne généralement pas avec la récursivité.
  2. vous avez défini votre fonction pour accepter une chaîne, mais rappelez-la avec un entier dans countVowels (vowelCount ++); cela, il se comportera mal.
  3. souvenez-vous toujours que vous devez d'abord définir votre cas de base dans votre fonction de récursivité, pour vous assurer que vous vous arrêterez un jour et ne générerez pas une boucle infinie.


0 commentaires