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

JS递归中如何保留计数器变量值?新手求解数字相乘次数统计问题

解决递归中计数器重置的问题(不修改函数参数数量)

嘿,我明白你遇到的问题了——递归里的计数器每次都被重置,这确实很让人头疼,尤其是不能改函数参数数量的限制。别担心,有几种简单的方法能解决这个问题,而且完全符合你的要求。

问题根源

你之前的写法里,应该是在函数内部直接初始化了计数器(比如let count = 0),每次递归调用这个函数时,都会创建一个全新的计数器变量,值被重置为0,之前的累加自然就丢失了。要解决这个问题,我们需要让计数器的状态在递归调用之间保持住,同时不修改原函数的参数数量。

方法1:利用递归返回值累加次数(最简洁)

这种方法不需要额外的计数器变量,而是通过递归的返回值来累计操作次数。思路是:如果当前数字已经是一位数,返回0;否则计算各位乘积,然后返回1 + 递归处理乘积的结果(这里的1代表当前这次相乘操作的次数)。

function persistence(num) {
  // 终止条件:一位数,不需要再相乘,返回0次
  if (num < 10) {
    return 0;
  }
  // 将数字转为字符串拆分,再计算各位乘积
  const product = num.toString()
    .split('')
    .reduce((total, digit) => total * parseInt(digit), 1);
  // 递归处理乘积,当前操作算1次,加上后续需要的次数
  return 1 + persistence(product);
}

举个例子,输入39:

  1. persistence(39) → 39不是一位数,计算乘积27,返回1 + persistence(27)
  2. persistence(27) → 27不是一位数,计算乘积14,返回1 + persistence(14)
  3. persistence(14) → 14不是一位数,计算乘积4,返回1 + persistence(4)
  4. persistence(4) → 4是一位数,返回0
    最终结果:1+1+1+0=3,完全正确。

方法2:使用内部辅助函数(保留计数器状态)

如果你更习惯用计数器变量的思路,可以在原函数内部定义一个辅助函数,把计数器作为辅助函数的参数。原函数保持只接受num的参数数量,初始调用辅助函数时传入计数器初始值0,递归时传递累加后的计数器值。

function persistence(num) {
  // 内部辅助函数,负责递归逻辑,接受当前数字和累计次数
  function calculate(currentNum, count) {
    if (currentNum < 10) {
      return count;
    }
    const product = currentNum.toString()
      .split('')
      .reduce((total, digit) => total * parseInt(digit), 1);
    // 递归调用时,次数加1
    return calculate(product, count + 1);
  }
  // 初始调用辅助函数,计数器从0开始
  return calculate(num, 0);
}

这个方法里,计数器count通过辅助函数的参数在递归调用间传递,每次递归都会把更新后的count传下去,不会被重置。原函数persistence的参数数量完全符合要求,外部调用时只需要传入数字即可。

两种方法都能完美解决你的问题,选你觉得更易理解的就行~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:34:02