我一直在研究Codewars的kata,挑战是编写一个持久性函数,该函数接受一个正数num并返回其乘法持久性,这是您必须将num中的数字相乘的次数直到达到个位数。
示例:
persistence(39) === 3 // because 3*9 = 27, 2*7 = 14, 1*4=4
// and 4 has only one digit
persistence(999) === 4 // because 9*9*9 = 729, 7*2*9 = 126,
// 1*2*6 = 12, and finally 1*2 = 2
persistence(4) === 0 // because 4 is already a one-digit number
试图弄清楚这一点时,我在网上遇到了一个解决方案(如下所示),并且在试图理解其逻辑之后,我不明白为什么代码不起作用
var count = 0;
function persistence(num) {
if (num.toString().length === 1) {
return count;
}
count++;
var mult = 1;
var splitStr = num.toString().split("");
for (var i = 0; i <= splitStr; i++) {
mult *= parseFloat(splitStr[i])
}
return persistence(parseFloat(mult));
}
任何一位数字的输出将为0,这是正确的,但是对于任何多位数的数字,持久性始终记录为1,我似乎无法弄清楚为什么,任何帮助将不胜感激。 / p>
答案 0 :(得分:2)
发布的代码有很多问题。
for (var i = 0; i <= splitStr; i++) {
但是splitStr
是一个数组,而不是数字; i <= splitStr
没有任何意义。应该检查splitStr.length
而不是splitStr
。
另一个问题是应该使用i <
而不是i <=
,否则最后的splitStr[i]
将是undefined
。
另一个问题是count
变量是全局变量,因此多次调用persistence
会导致结果不准确。完全不需要count
变量。要解决它:
function persistence(num) {
if (num.toString().length === 1) {
return 0;
}
var mult = 1;
var splitStr = num.toString().split("");
for (var i = 0; i < splitStr.length; i++) {
mult *= parseFloat(splitStr[i])
}
return 1 + persistence(parseFloat(mult));
}
console.log(
persistence(999),
persistence(39),
persistence(4)
);
或者,可以完全避免for
循环,而使用更合适的数组方法:
function persistence(num) {
const str = num.toString();
if (str.length === 1) {
return 0;
}
const nextNum = str.split('').reduce((a, b) => a * b, 1);
return 1 + persistence(nextNum);
}
console.log(
persistence(999),
persistence(39),
persistence(4)
);
答案 1 :(得分:0)
const persistence=(num)=>{
let splitNumArr=num.toString().split('')
let newList
let count=0
while(splitNumArr.length>1){
newList=splitNumArr.reduce((acc,curr)=>{
return acc*=curr
})
splitNumArr=newList.toString().split('')
count++
}
return count
}
console.log(persistence(39))===3
console.log(persistence(999))===4
console.log(persistence(9))===0