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:
persistence(39)→ 39不是一位数,计算乘积27,返回1 + persistence(27)persistence(27)→ 27不是一位数,计算乘积14,返回1 + persistence(14)persistence(14)→ 14不是一位数,计算乘积4,返回1 + persistence(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
相关产品推荐
相关产品推荐

