为什么这个递归countOccurence函数不起作用?这有一个子程序。有没有办法在没有子程序的情况下做到这一点?看来在javascript中你必须有一个用于计数器变量的闭包(子程序函数),否则每次都会被重写!
function numOccurencesRecursive(arr, val) {
//base case. check it if it only has a length of 1
var count = 0;
function doCount(arr, val) {
if (arr[0] === val) {
count++;
} else {
count += doCount(arr.slice(1), val)
}
return count;
}
return doCount(arr, val);
}
console.log(numOccurencesRecursive([2, 7, 4, 4, 1, 4], 4)); // should return 3 but returns 1
答案 0 :(得分:4)
这绝对应该与递归的所有巢:
function countItems(arr, item) {
var count = 0;
for (var i=0; i<arr.length; i++){
if (typeof(arr[i]) == typeof([])){
count += countItems(arr[i], item);
}
else{
if(typeof(arr[i]) != typeof([])){
if (arr[i] === item){
++count;
}
}
}
}
return count;
}
答案 1 :(得分:3)
我认为问题在于你是在迭代思考,而是使用递归方法。
迭代方法有一个全局变量,可以在每一步更新:
function numOccurencesIterative(arr, val) {
var count = 0;
for(var i=0; i<arr.length; ++i) if(arr[i] === val) ++count;
return count;
}
但是,使用递归方法时,最好避免使用全局变量。
function numOccurencesRecursive(arr, val) {
if(!arr.length) return 0;
return (arr[0] === val) + numOccurencesRecursive(arr.slice(1), val);
}
答案 2 :(得分:1)
doCount
一旦找到匹配就会停止递归;因此,它永远不会发现超过1场比赛。
答案 3 :(得分:1)
所以,你正在做的是你只有在找到值时才递增计数,当你找到它时,你的递归函数结束,但反之亦然,这意味着你必须计算得不合适数组中的元素,如果找到某些内容,则递增它,然后如果数组为空,则返回计数。
代码:
function numOccurencesRecursive(arr, val) {
//base case. check it if it only has a length of 1
var count = 0;
function doCount(arr, val) {
if (arr[0] === val) {
count++;
} else if (!arr.length) {
return count;
}
return doCount(arr.slice(1), val);
}
return doCount(arr, val);
}
console.log(numOccurencesRecursive([2, 7, 4, 4, 1, 4], 4)); // should return 3 but returns 1