Javascript:乘法持久性问题提出的解决方案执行超时

Javascript:乘法持久性问题提出的解决方案执行超时,javascript,function,loops,if-statement,while-loop,Javascript,Function,Loops,If Statement,While Loop,我有以下问题: 编写一个名为persistence的函数,它接受一个正参数num并返回其乘法持久性,即必须将num中的数字相乘直到达到一个位数的次数 function persistence(num) { let count = 0; let numStr = num.toString(); if (numStr.length === 1){ return 0 } if (numStr.length === 2){ while (numS

我有以下问题:

编写一个名为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毫秒)”错误。我知道有不同的方法来解决这个问题,但我想知道我的代码到底出了什么问题

使用递归函数,您可以轻松完成:

只需添加一个新的args
count
(调用此函数的次数)并在结果长度大于1时调用它

函数持久性(num,count){
计数=计数| | 0;
设numStr=num.toString();
如果(numStr.length==1){
返回计数
} 
让new_num=numStr.split(“”)。reduce((acc,val)=>{
返回acc*val
}, 1)
返回持久性(新数量,计数+1)
}
console.log(“99”,持久性(99))
console.log(“999”,持久性(999))

console.log(“99999”,persistence(99999))
您的代码不工作的原因是因为您总是向最终结果添加
str[2]

999 > 729 > 126 > 12 > 2
因此,在这里您可以看到,在一个循环中,编号变为
12
str[2]
undefined
,它将是
NaN
,因此循环永远不会结束

一种简单的方法是在
中使用
reduce()
,而在相乘时不需要将数字转换为
Number()

函数持久性(num){
让计数=0;
num=字符串(num);
while(num.length>1){
计数++;
num=String([…num].reduce((ac,a)=>a*ac,1));
}
返回计数;
}

console.log(persistence(999))
if
stations我看不出有任何不同的原因。您的“3”案例假设循环中的字符串总是3位数长;不会的,因此您最终得到的是
NaN
,并且始终是
NaN
(并且长度超过一个字符)。while循环的第一次迭代得到
9*9*9=729
。然后
7*2*9=126
,然后
1*2*6=12
,然后
1*2*undefined=NaN
,然后
N'*'a'*'N'=NaN
,然后
N'*'a'*'N'=NaN
,等等。您还可以跳过额外的参数并
返回持久性(new_num)+1在基本情况下使用
返回0
,而不是
返回计数
。否。因为
返回0
将假定这是您第一次调用此函数。(或者我不明白)@Paulpro的编写方式至少可以对尾部调用进行优化(尽管大多数JS运行时都没有这样做)@Arthur如果
numStr.length==1
第一次调用函数,那么0是正确的答案。它看起来是这样的:并且总是给出与函数相同的输出,但在我看来这更容易理解,因为每次递归调用都只是计算下一个数字的持久性。答案很好,但请不要使用
x+'
而不是
String(x)
@georg我改变了这一点。我还想解释一下为什么使用
String(x)
而不是
x+'
@georg
x+'
是JavaScript中强制使用字符串的常用方法。没有理由经常使用字符串构造函数
num.toString()
会更好,但用空字符串连接可能是最好的。@Paulpro:
string(x)
不是构造函数。@georg。(和:)。您可以在不使用
new
的情况下调用它,但是
String
仍然是构造函数,无论您是否将其用作构造函数。