You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用递归检查嵌套数组中某个数字的出现次数是否等于指定次数

递归统计嵌套数组中目标数字的出现次数是否等于指定次数

我需要实现一个递归函数,判断未知嵌套层数的数组中目标数字N的出现次数是否恰好等于K。以下是我编写的代码和测试用例,但运行结果不符合预期:

现有代码

function doesNumAppearKTimes(arr, N, K, count = 0) {
  for(let i = 0;i<arr.length; i++) {
    if(Array.isArray(arr[i])) {
      doesNumAppearKTimes(arr[i],N,K,count)
    } else if(arr[i] === N) {
      count++
    }
  }
  return count === K;
}

测试用例

console.log(doesNumAppearKTimes([1,2,[3,4,[5],6],3,7],3,3)); // 预期输出: false(实际3出现2次)
console.log(doesNumAppearKTimes([[0,-8,1,[-2,2]],[11,[4],6],2,2],2,3)); // 预期输出: true(2出现3次)
console.log(doesNumAppearKTimes([10,21,4,9,3,7,4,1],4,1)); // 预期输出: false(4出现2次)

问题根源

你的代码核心问题在于count参数的传递逻辑:JavaScript中基本类型是按值传递的,递归调用doesNumAppearKTimes(arr[i],N,K,count)时,内层函数的count是外层count的副本,内层对count的修改不会同步到外层。这导致最终统计的count只计算了最外层数组中N的出现次数,嵌套数组里的N完全没被统计进去。

修复方案

这里提供两种可行的修复思路:

思路1:让递归子函数返回统计次数

每次处理子数组时,将递归返回的次数累加到当前层级的count中:

function doesNumAppearKTimes(arr, N, K) {
  function countOccurrences(arr) {
    let count = 0;
    for (const item of arr) {
      if (Array.isArray(item)) {
        count += countOccurrences(item);
      } else if (item === N) {
        count++;
      }
    }
    return count;
  }
  return countOccurrences(arr) === K;
}

思路2:用引用类型传递计数器

利用对象按引用传递的特性,修改对象属性时会同步到所有引用位置:

function doesNumAppearKTimes(arr, N, K) {
  const counter = { count: 0 };
  function traverse(arr) {
    for (const item of arr) {
      if (Array.isArray(item)) {
        traverse(item);
      } else if (item === N) {
        counter.count++;
      }
    }
  }
  traverse(arr);
  return counter.count === K;
}

验证结果

替换修复后的代码后,所有测试用例都会输出符合预期的结果:

  • 第一个测试用例中3出现2次,返回false
  • 第二个测试用例中2出现3次,返回true
  • 第三个测试用例中4出现2次,返回false

内容的提问来源于stack exchange,提问作者kingdin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 17:08:17