Javascript while循环计数高于预期值

Javascript while循环计数高于预期值,javascript,Javascript,我正在写一个函数,它接受一个正数,并返回必须乘以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中的数字的次数,直到达到一个位数

例如:

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;

我已经通过添加数组和筛选唯一值修复了上述问题,但仍然想知道为什么代码给我的计数比预期高得多。

您可能希望在此处使用递归-如果
num
小于
10
,则返回0,否则,执行所需的乘法,然后返回产品上调用
test
的结果:

功能测试(num){
返回数值<10
? 0
:1+测试(
num.toString().split(“”).reduce((a,c)=>a*c)
)
}

控制台日志(测试(39))
您可能希望在此处使用递归-如果
num
小于
10
,则返回0,否则,执行所需的乘法,然后返回调用产品的
test
的结果:

功能测试(num){
返回数值<10
? 0
:1+测试(
num.toString().split(“”).reduce((a,c)=>a*c)
)
}

控制台日志(测试(39))在您的代码中更正,您可以比较

    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;
功能测试(num){
如果(num<10){return num}else{
风险值a;风险值计数=0;
而(数值>10){
a=num.toString().split(“”).map(e=>parseInt(e)).reduce((a,c)=>a*c);
num=a;
计数++;
}  
返回计数;
}}
测试(39)//输出3;

在您的代码中进行更正,您可以比较

    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;
功能测试(num){
如果(num<10){return num}else{
风险值a;风险值计数=0;
而(数值>10){
a=num.toString().split(“”).map(e=>parseInt(e)).reduce((a,c)=>a*c);
num=a;
计数++;
}  
返回计数;
}}
测试(39)//输出3;

您正在递减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;
}}
功能测试(num){
如果(num<10){return num}else{
var j=num;var a=11;//只需进入while循环至少一次
var计数=0;
而(a>10){
a=num.toString().split(“”).map(e=>parseInt(e)).reduce((a,c)=>a*c);
num=a;
计数++;
j--;
}  
返回计数;
}}

您正在递减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;
}}
功能测试(num){
如果(num<10){return num}else{
var j=num;var a=11;//只需进入while循环至少一次
var计数=0;
而(a>10){
a=num.toString().split(“”).map(e=>parseInt(e)).reduce((a,c)=>a*c);
num=a;
计数++;
j--;
}  
返回计数;
}}

每次迭代将
num
减少1。它为您提供
29
,因为
39-10
29
。您没有更新实际的
num
,如果它仍然大于10,则需要对其进行比较

改为这样做:

功能测试(num){
如果(数值<10){
返回数
}否则{
var计数=0;
而(数值>10){
num=num.toString().split(“”).map(e=>parseInt(e)).reduce((a,c)=>a*c);
计数++;
}
返回计数;
}
}

log(test(39))
您每次迭代都将
num
减少1。它为您提供
29
,因为
39-10
29
。您没有更新实际的
num
,如果它仍然大于10,则需要对其进行比较

改为这样做:

功能测试(num){
如果(数值<10){
返回数
}否则{
var计数=0;
而(数值>10){
num=num.toString().split(“”).map(e=>parseInt(e)).reduce((a,c)=>a*c);
计数++;
}
返回计数;
}
}

console.log(test(39))
如果
num
已经低于10,它不应该返回
0
而不是数字本身吗?我的意思是,您将函数描述为返回迭代次数,而不是计算结果。
j--
部分使结果过高。您可以在while中添加
console.log(a,num,j)
来查看它在做什么(或者逐步使用调试器)。同样
return num
在开始时没有任何意义,应该是
return 0
因为numYou是对的,不知道为什么我甚至把j部分放在这里,然后忘记了它。没有它就可以工作。如果
num
已经低于10,它不应该返回
0
而不是数字本身吗?我的意思是,您将函数描述为返回迭代次数,而不是计算结果。
j--
部分使结果过高。您可以在while中添加
console.log(a,num,j)
来查看它在做什么(或者逐步使用调试器)。同样的
return num
在开始时没有任何意义,应该是
return 0
,因为numYou是对的,不知道为什么我甚至把j部分放在这里,然后忘记了它。没有它就可以工作。如果(num<10)
{return num}
如果OP试图计算生成一个位数所需的迭代次数,则返回num
没有意义number@PeterB用
?:
=
如果(numTrue,OP的描述似乎与他们尝试的不匹配。谢谢大家。这很有效。而且第一行中的>符号是一种类型,现在更正了if(num<10)
{return num}
如果OP试图计算生成一个位数所需的迭代次数,则返回num
没有意义number@PeterB用
?:
=
if(numTrue,OP的描述似乎和他们尝试的不匹配。谢谢大家。这很有效