Мультипликативное постоянство Codewars Challenge

Я работал над ката от Codewars, задача состоит в том, чтобы написать функцию, постоянство, которая принимает положительный параметр num и возвращает его мультипликативную постоянство, то есть количество раз, которое вы должны умножить цифры в num, пока не достигнете одна цифра.

Пример:

persistence(39) === 3 // because 3*9 = 27, 2*7 = 14, 1*4=4
                       // and 4 has only one digit

persistence(999) === 4 // because 9*9*9 = 729, 7*2*9 = 126,
                        // 1*2*6 = 12, and finally 1*2 = 2

persistence(4) === 0 // because 4 is already a one-digit number

Пытаясь понять это, я наткнулся на решение в Интернете (показано ниже), и после попытки понять его логику я не мог понять, почему код не работает.

var count = 0;

function persistence(num) {
  if (num.toString().length === 1) {
    return count;
  }
  count++;
  var mult = 1;
  var splitStr = num.toString().split("");
  for (var i = 0; i <= splitStr; i++) {
    mult *= parseFloat(splitStr[i])
  }
  return persistence(parseFloat(mult));
}

Вывод для любого однозначного числа будет 0, что является правильным, однако для любого числа, состоящего из нескольких цифр, постоянство всегда регистрируется как 1, и я не могу понять, почему, любая помощь будет принята с благодарностью.

Если вы спрашиваете, почему вторая часть кода работает именно так, лучше не запутывать проблему, показывая другой код. Кроме того, оба фрагмента кода используют цикл for и не отображают while....

Heretic Monkey 18.02.2019 22:01

Кроме того, опубликованный код приводит к чему-то другому, поскольку count устанавливается на 0 только при первом запуске...

Heretic Monkey 18.02.2019 22:04

Вторая функция плохая, она зависит от глобальной переменной count, поэтому дает разный результат в зависимости от того, когда она была вызвана. Его следует переписать на return 0 и return 1 + persistence(...) и вообще не использовать глобальное count.

Roman Hocke 18.02.2019 22:06
Я наткнулся на решение, предложенное здесь, в Stack Overflow. - ссылка наверное будет полезна. Кроме того, вы спрашиваете, почему чужой код не работает?
Matt Burland 18.02.2019 22:09

@HereticMonkey Извините, я разместил неправильный фрагмент кода, но теперь удалил его, так как понимаю, почему это может сбивать с толку.

kish-an 18.02.2019 22:10
этот ответ может вас заинтересовать
Mulan 18.02.2019 22:11

@ user633183 ОП знает, как решить проблему; они специально спрашивают, почему размещенный код не работает.

Heretic Monkey 18.02.2019 22:13

@MattBurland Извините за это, я искал первоисточник и понял, что он был на coderbyte, поэтому я соответствующим образом отредактировал свой пост (не уверен, что вы можете сделать ссылку вне переполнения стека). Я пытаюсь понять, почему код не работает, поскольку я прочитал его и не уверен, в чем именно заключается проблема.

kish-an 18.02.2019 22:19
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
8
4 889
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Опубликованный код имеет довольно много проблем.

for (var i = 0; i <= splitStr; i++) {

Но splitStr — это массив, а не число; i <= splitStr не имеет смысла. Он должен проверяться на splitStr.length вместо splitStr.

Другая проблема заключается в том, что он должен использовать i <, а не i <=, иначе окончательный splitStr[i] будет undefined.

Другая проблема заключается в том, что переменная count является глобальной, поэтому более чем один вызов persistence приведет к неточным результатам. Переменная count вообще не нужна. Починить это:

function persistence(num) {
  if (num.toString().length === 1) {
    return 0;
  }
  var mult = 1;
  var splitStr = num.toString().split("");
  for (var i = 0; i < splitStr.length; i++) {
    mult *= parseFloat(splitStr[i])
  }
  return 1 + persistence(parseFloat(mult));
}

console.info(
  persistence(999),
  persistence(39),
  persistence(4)
);

Или можно полностью избежать цикла for и использовать более подходящие методы массива:

function persistence(num) {
  const str = num.toString();
  if (str.length === 1) {
    return 0;
  }
  const nextNum = str.split('').reduce((a, b) => a * b, 1);
  return 1 + persistence(nextNum);
}

console.info(
  persistence(999),
  persistence(39),
  persistence(4)
);

или мы можем использовать цикл while с методом уменьшения массива

const persistence=(num)=>{

  let splitNumArr=num.toString().split('')
  let newList
  let count=0
  while(splitNumArr.length>1){

     newList=splitNumArr.reduce((acc,curr)=>{
        return acc*=curr
     })
      splitNumArr=newList.toString().split('')
      count++

  }

return count
}



console.info(persistence(39))===3
console.info(persistence(999))===4
console.info(persistence(9))===0

Другие вопросы по теме