以递归方式计算出现次数

时间:2015-08-31 00:09:14

标签: javascript recursion

为什么这个递归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

4 个答案:

答案 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