gpt4 book ai didi

javascript - 如果每次递归调用都将 var 设置回其初始值,如何使用递归保持计数器 var 的值

转载 作者:行者123 更新时间:2023-11-29 17:46:28 25 4
gpt4 key购买 nike

我是编程的新手,特别是 js,我正在解决一个问题,我必须返回给定数字(参数)需要乘以其数字直到它变成一位数字(小于10).我知道除了计数器之外我的一般逻辑是有效的。我想不出一种方法来保持它的值不受先前递归调用的影响(不修改我传递给函数本身的参数数量)。它总是被设置回 0。我的逻辑中有什么明显的缺失吗?

到目前为止我的代码:

function persistence(num) {
var countTimes = 0; // it will always go back to zero here
var numToArr = String(num).split('').map(nums => Number(nums));
var resultOfMultNumDigits = numToArr.reduce(function (a,b) {return a * b},1);
if (resultOfMultNumDigits < 10){
return countTimes;
}else {
countTimes += 1; // increases here every time the case base isn't reach
return persistence(resultOfMultNumDigits);
}
}

最佳答案

长话短说

当使用递归时,有一个“计数器”变量可能是一种代码味道。通常在递归代码中,您想要的结果是this“迭代”中某些操作的结果,结合next迭代的结果(结合 next 的结果em>下一个,依此类推......)。

当你想要的结果只是迭代次数时,递归函数(myFunc)的最后一行通常是这样的:return 1 + myFunc(dataForNextIteration);。这正是这里的情况(我们假设 toDigitsproduct 是按照他们在锡 jar 上所说的那样做的函数):

function persistence(num) {
const digits = toDigits(num);
if (digits.length === 1) {
return 0;
}
return 1 + persistence(product(digits));
}

如何到达那里

我们要计算“迭代次数”(𝒊)。如果𝒊从0开始,经过𝒊迭代后的结果应该是𝒊。如果输入是一个一位数字,我们的工作就完成了,所以我们只返回 0 而无需进一步递归。这是开始编写代码的好地方。

function persistence(num) {
const digits = toDigits(num);
if (digits.length === 1) {
return 0;
}

// ...
}

这是我们的“终止案例”:一个数字?停止递归并返回 0

如果 digits.length 大于 1 怎么办?很自然地,我们想得到digits的乘积,传递给persistence的下一次“迭代”。但是我们如何处理结果呢?

假设num是123,它的各位数字的乘积是6,是一位数。然后,我们知道 下一个 迭代将达到我们的停止条件并返回 0。这意味着这个 迭代应该返回1。我们如何从 0 得到 1?添加1:

function persistence(num) {  // num => 123
const digits = toDigits(num); // digits => [1, 2, 3];
if (digits.length === 1) { // digits.length => 3
return 0;
}

const digitsProduct = product(digits); // digitsProduct => 6
const nextResult = persistence(digitsProduct); // nextResult => 0
return 1 + nextResult; // 1 + 0
}

为了演示,这有点冗长。您可以在下面的工作片段中看到它不那么冗长:

function toDigits(num) {
return String(num).split('').map(n => parseInt(n));
}

function product(arr) {
return arr.reduce((prod, n) => prod * n, 1);
}

function persistence(num) {
const digits = toDigits(num);
if (digits.length === 1) {
return 0;
}
return 1 + persistence(product(digits));
}

// ...or terser still...
function persistence(num) {
const d = toDigits(num);
return d.length === 1 ? 0 : 1 + persistence(product(d));
}

console.log(persistence(5)); // => 0
console.log(persistence(123)); // => 1
console.log(persistence(1234)); // => 2
console.log(persistence(123456)); // => 2
console.log(persistence(999)); // => 4

关于javascript - 如果每次递归调用都将 var 设置回其初始值,如何使用递归保持计数器 var 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49012506/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com