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.
3 Réponses :
Vous faites deux erreurs:
string
, count
(nombre de voyelles) et l'index actuel i
. 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
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 /…
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).
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.
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: