每次函数调用后清除计数器:JavaScript 递归函数



我有一个与乘法持久性相关的问题的后续解决方案。但是,我需要在每次函数调用后擦除计数器。 我尝试了不同的返回语句、计数器和数组。

我似乎无法在每次函数调用和后清除计数器 得到正确答案。它正在添加来自多个函数调用的所有答案。

function persistence(num, counter = 0) {
if (num.toString().length != 1) {
num = num.toString().split("").filter(Number).reduce((a, b) => a * b);
persistence(num, ++counter);
}
return counter;
}

persistence(999) // Answer should be 4.
persistence(25)// Answer should be 2 not 6 or 1.

这里的测试:

describe('Initial Tests', function () {
Test.assertEquals(persistence(39),3);
Test.assertEquals(persistence(4),0);
Test.assertEquals(persistence(25),2);
Test.assertEquals(persistence(999),4);
});

您需要返回每个递归调用的结果并处理 else 情况。

试试这个:

function persistence(num, counter = 0) {
if (num.toString().length != 1) {
num = num.toString().split("").filter(Number).reduce((a, b) => a * b);
return persistence(num, ++counter);
} else {
return counter;
}
}

以下是来自控制台的结果:

> persistence(25)
< 2
> persistence(999)
< 4

我假设您正在尝试计算乘法数字根,但这不会像您处理上述.filter(Number)那样从计算中删除零。下面,我们写multiplicativeRoot,它返回将数字减少到一位数所需的步骤数组

最后,乘法持久性可以通过简单地计算返回值中的步数multiplicativeRoot并减去1来计算(结果中的第一个值始终是输入值)

结果是由多个函数组成的multiplicativePersistence的实现,每个函数都有其独特而明确的用途

const digits = n =>
n < 10
? [ n ]
: digits (n / 10 >> 0) .concat ([ n % 10 ])
const mult = (x,y) =>
x * y
const product = xs =>
xs.reduce (mult, 1)
const multiplicativeRoot = x =>
x < 10
? [ x ]
: [ x ] .concat (multiplicativeRoot (product (digits (x))))

const multiplicativePersistence = x =>
multiplicativeRoot (x) .length - 1

console.log (multiplicativeRoot (999))        // [ 999, 729, 126, 12, 2 ]
console.log (multiplicativePersistence (999)) // 4
console.log (multiplicativeRoot (25))         // [ 25, 10, 0 ]
console.log (multiplicativePersistence (25))  // 2

最新更新