Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 递归计算发生次数_Javascript_Recursion - Fatal编程技术网

Javascript 递归计算发生次数

Javascript 递归计算发生次数,javascript,recursion,Javascript,Recursion,为什么这个递归countoccurrence函数不起作用?这有一个子程序。有没有一种不用子程序的方法?在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 (

为什么这个递归countoccurrence函数不起作用?这有一个子程序。有没有一种不用子程序的方法?在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

doCount
一旦找到匹配项,就会停止递归;因此,它将永远不会找到超过1个匹配项进行计数。

因此,您要做的是,仅当您找到值时才增加计数,当您找到值时,递归函数结束,但反过来,这意味着您必须对数组中未找到的元素进行计数,如果您找到了某个元素,递增它,然后如果数组为空,则返回计数

代码:


我认为问题在于,您一直在反复思考,但使用了递归方法

迭代方法有一个全局变量,可在每个步骤更新:

函数numocurencesiteractive(arr,val){
var计数=0;

对于(var i=0;i而言,这肯定适用于所有递归嵌套:

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;
}
功能计数项目(arr,项目){
var计数=0;

对于(var i=0;我看不到这一点,你能再解释一点吗?删除外部
count
变量,通过
返回0
处理基本大小写;然后添加一个适当的重复大小写。对于重复大小写,“此字符是否匹配?”和“下一个字符中有多少匹配?”所需的所有计数信息都已准备就绪。That将简化逻辑——包括修复此错误——并使其更接近“理想”递归函数。哇,太酷了……您如何向布尔值添加递归调用,然后获得一个数字?能否显示前几个递归调用?@freezycold布尔值在引擎盖下被转换为数字
0
1
。您可以可能更喜欢
(arr[0]==val?1:0)
很棒。我如何重构以返回偶数次出现的第一个元素?要编辑上面的代码以包含我的尝试,我将使用映射(或对象,如果所有项都由字符串唯一标识)计算每个项在数组中出现的次数。然后迭代到偶数。
var m=new Map();arr.forEach(item=>m.set(item,(m.get(item)| | 0)+1);arr.find(item=>!(m.get(item)%2))
谢谢。这里有一句话要告诉你:我起初不太明白这个函数应该做什么,我已经修好了:)现在应该可以了。如果
val==undefined
,这将产生无限递归。我建议在
arr[0]==val
之前检查
arr.length
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;
}