我正在编写一个函数,该函数接受一个正数并返回必须将num中的数字相乘的次数,直到达到一位为止。
示例:
test(39) === 3 // because 3*9 = 27, 2*7 = 14, 1*4=4
// and 4 has only one digit//if single digit return num
代码:
function test(num) {
if (num > 10) { return num} else {
var j = num;var a;var count = 0;
while ( j > 10){
a = num.toString().split('').map( e=> parseInt(e)).reduce((a,c)=> a*c);
num = a;
count++;
j--;
}
return count;
}}
test(39) //outputs 29 expected 3;
我通过添加数组并过滤唯一值来解决上述问题,但仍然想知道为什么代码给我的计数比预期的高得多。
答案 0 :(得分:2)
您可能正在这里使用递归-如果num
小于10
,则返回0,否则,执行所需的乘法,然后返回{{ 1}} 在产品上调用1 +
的结果:
test
(请注意,function test(num) {
return num < 10
? 0
: 1 + test(
num.toString().split('').reduce((a, c) => a * c)
)
}
console.log(test(39));
已经将字符串强制为数字,不需要*
)
答案 1 :(得分:1)
在代码中更正,您可以进行比较
function test(num) {
if (num < 10) { return num} else {
var a;var count = 0;
while ( num > 10){
a = num.toString().split('').map( e=> parseInt(e)).reduce((a,c)=> a*c);
num = a;
count++;
}
return count;
}}
test(39) //outputs 3;
答案 2 :(得分:0)
您要递减j,它最初是39。它将递减10,然后将返回它递减的次数(29次,与您的结果一致)。假设分割的部分正确,您需要执行以下操作:
function test(num) {
if (num < 10) { return num} else {
var j = num;var a = 11; // just to enter the while loop at least once
var count = 0;
while ( a > 10){
a = num.toString().split('').map( e=> parseInt(e)).reduce((a,c)=> a*c);
num = a;
count++;
j--;
}
return count;
}}
答案 3 :(得分:0)
您每次将num
递减1。它给您29
,因为39 - 10
是29
。如果实际的num
仍然大于10,则无需更新。
执行此操作:
function test(num) {
if (num < 10) {
return num
} else {
var count = 0;
while (num > 10) {
num = num.toString().split('').map(e => parseInt(e)).reduce((a, c) => a * c);
count++;
}
return count;
}
}
console.log(test(39))