你好,我试图理解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++);
我试图在每次调用该函数时增加元音计数。
感谢您的指导。
答案 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 == 1
和false == 0
),然后通过计算下一个(小于一个)字符串来求和。
答案 1 :(得分:1)
您犯了两个错误:
string
,count
(元音数)和当前索引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)
关于您的解决方案的注释:
答案 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));
}