我有以下问题:
编写一个函数 persistence,它接受一个正参数 num 并返回其乘法持久性,这是您必须将数字乘以 num 直到达到个位数的次数。
function persistence(num) {
let count = 0;
let numStr = num.toString();
if (numStr.length === 1){
return 0
}
if (numStr.length === 2){
while (numStr.length > 1){
count += 1
numStr = (Number(numStr[0])*Number(numStr[1])).toString()
}
}
if (numStr.length === 3){
while (numStr.length > 1){
count += 1
numStr = (Number(numStr[0])*Number(numStr[1])*Number(numStr[2])).toString()
}
}
return count
}
persistence(999) //solution 4
我收到"执行超时(12000 毫秒("错误。 我知道有不同的方法可以解决这个问题,但我想知道我的代码出了什么问题。
代码不起作用的原因,因为您总是在最终结果中添加str[2]
。
999 > 729 > 126 > 12 > 2
所以在这里你看到一个循环编号变得12
并且str[2]
undefined
并且它将NaN
,因此循环永远不会结束。
一个简单的方法是在while
中使用reduce()
,无需在乘法时将 转换为Number()
function persistence(num) {
let count = 0;
num = String(num);
while(num.length > 1){
count++;
num = String([...num].reduce((ac,a) => a * ac,1));
}
return count;
}
console.log(persistence(999))
使用递归函数,您可以轻松完成:
只需添加一个新的 args count
(调用此函数的次数(并在结果长度大于 1 时调用它
function persistence(num, count) {
count = count || 0;
let numStr = num.toString();
if (numStr.length === 1) {
return count
}
let new_num = numStr.split('').reduce((acc, val) => {
return acc * val
}, 1)
return persistence(new_num, count + 1)
}
console.log("99", persistence(99))
console.log("999", persistence(999))
console.log("99999", persistence(99999))