我有以下问题:
编写一个持久性函数,该函数接受一个正数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毫秒)”错误。我知道有多种方法可以解决此问题,但我想具体了解我的代码有什么问题。
答案 0 :(得分:2)
由于始终将str[2]
添加到最终结果中而导致代码无法正常工作的原因。
999 > 729 > 126 > 12 > 2
因此,在这里您看到一个循环编号变成12
,而str[2]
是undefined
,它将是NaN
,因此循环永远不会结束。
一种简单的方法是在reduce()
中使用while
,而在乘法时无需将其转换为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))
答案 1 :(得分:1)
具有递归功能,您可以轻松做到:
只需添加一个新的参数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))