Javascript,而循环计数高于预期

时间:2018-11-20 10:12:21

标签: 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;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;

我通过添加数组并过滤唯一值来解决上述问题,但仍然想知道为什么代码给我的计数比预期的高得多。

4 个答案:

答案 0 :(得分:2)

您可能正在这里使用递归-如果num小于10,则返回0,否则,执行所需的乘法,然后返回{{ 1}} 在产品上调用1 +的结果

test

(请注意,function test(num) { return num < 10 ? 0 : 1 + test( num.toString().split('').reduce((a, c) => a * c) ) } console.log(test(39));已经将字符串强制为数字,不需要*

答案 1 :(得分:1)

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

    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;

答案 2 :(得分:0)

您要递减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;
}}

答案 3 :(得分:0)

您每次将num递减1。它给您29,因为39 - 1029。如果实际的num仍然大于10,则无需更新。

执行此操作:

function test(num) {
  if (num < 10) {
    return num
  } else {
    var count = 0;
    while (num > 10) {
      num = num.toString().split('').map(e => parseInt(e)).reduce((a, c) => a * c);
      count++;
    }
    return count;
  }
}

console.log(test(39))