使用JavaScript递归计算字符串中的元音

时间:2019-04-10 21:29:15

标签: javascript string recursion count

你好,我试图理解JavaScript中的递归。

到目前为止,我有:

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;
}

首先,这给我带来了问题,因为charAt未定义。迭代时我还能怎么说“当前索引处的字符”?

我不能使用for循环-我必须使用递归。

第二,我在这里正确使用递归吗?

countVowels(vowelCount++);

我试图在每次调用该函数时增加元音计数。

感谢您的指导。

4 个答案:

答案 0 :(得分:2)

如果您感兴趣的话,可以使用以下版本,该版本不跟踪索引或计数,这可能会更多地说明如何进行递归。

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

我们的基本情况是字符串为空,因此我们返回0。

否则,我们将检查字符串中的第一个字符是否是元音(javascript中的true == 1false == 0),然后通过计算下一个(小于一个)字符串来求和。

答案 1 :(得分:1)

您犯了两个错误:

  • 您应该具有三个参数stringcount(元音数)和当前索引i
  • 您应该使用includes()而不是将字符与"aeiouAEIOU"进行比较

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

正如OP在评论中所问的那样:“能否请您解释为什么是if("aeiou".includes(string[i].toLowerCase()))而不是if(string[i].includes("aeiou".toLowerCase()))

因此,首先我们应该知道包含内容的内容。 includes()检查字符串是否包含传递给它的某个子字符串。使用该方法的字符串将是较大的字符串,而传递给includes()的值将是较小的字符串。

错了。

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

纠正一个。

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

答案 2 :(得分:1)

一种可能的解决方案是:

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));

,您应该像下面这样调用函数:countVowels('abc',0)

关于您的解决方案的注释:

  1. 您总是在函数内部重置vowelCount,这通常不适用于递归。
  2. 您已定义函数以接受字符串,但在countVowels(vowelCount ++)中使用整数来调用它;这会不当行为。
  3. 始终记住,必须在递归函数中定义基本案例的第一件事,以确保您将在某个时间停止并且不会生成无限循环。

答案 3 :(得分:0)

使用正则表达式和 slice() 方法的替代 ES6 解决方案。正则表达式 test() 方法将为元音返回 true,并且如之前的答案中所述,JavaScript 认为 true + true === 2

const countVowels = str => {
  return !str.length ? 0 : /[aeiou]/i.test(str[0]) + countVowels(str.slice(1));
}