Javascript: мультипликативная проблема персистентности Предложенное решение Тайм-аут выполнения - PullRequest
1 голос
/ 05 апреля 2019

У меня следующая проблема:

Напишите функцию постоянства, которая принимает положительный параметр 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 мс)». Я знаю, что есть разные способы решения этой проблемы, но я хочу точно знать, что не так с моим кодом.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Причина, по которой ваш код не работает, потому что вы всегда добавляете 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 голос
/ 05 апреля 2019

С рекурсивной функцией вы можете сделать это легко:

Просто добавьте новые аргументы 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...