Перекрывающиеся циклы внутри функций - PullRequest
0 голосов
/ 03 мая 2018

В кодовых войнах я тренируюсь над проектом мультипликативного обратного. Например, цель - если на входе «39», то на выходе должно быть «4» [39 = 3 * 9 ==> 27 = 2 * 7 => 14 = 1 * 4 ==> (4)] , я написал некоторый код, который просто умножает входные данные только для первого уровня (39 ==> 27).

Мой код до сих пор,

function persistence(num) {

var digits = new Array();
digits = num.toString().split("").map(Number);
var res = 1;
for (i = 0; i < digits.length; i++) { res = res * digits[i]; }
return res;
console.log(persistence(digits));

}

Я только изучаю javascript и застрял здесь. Мне нужно зациклить этот процесс, пока я не получу однозначное число.

МОЖЕТ КТО-ТО ПОЖАЛУЙСТА, ПОМОГИТЕ МНЕ? Извините, если мой вопрос не ясен ...

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

Помимо форматирования это очень похоже на ваш код. Я прокомментировал только два изменения:

function persistence(num) {

    var digits = new Array();
    digits = num.toString().split("").map(Number);

    // 1) Added this if statement to return the result
    //   immediately if there is only one digit.
    if ( digits.length === 1 )
        return digits[0];

    var res = 1;
    for (i = 0; i < digits.length; i++) 
        res = res * digits[i];

    // 2) Changed from `return res;` so that the function you wrote
    //   is called again on the result (if there were more than one digit).
    return persistence(res);

}

console.log(persistence('39'));

Для более короткого решения вы можете использовать:

function persistence(num) {
    return num < 10 
      ? num
      : persistence( (num+'').split('').reduce( (a,b) => a*b ) );
}

console.log(persistence('39'));
0 голосов
/ 03 мая 2018

Методы массива - ваш друг. В этом случае используйте map и reduce:

function multiplyDigits(num) {
  if (num < 10) return num;
  console.log(num);
  const multiplied = String(num)
    .split('')
    .map(Number)
    .reduce((a, n) => a * n, 1);
  return multiplyDigits(multiplied);
}
console.log(multiplyDigits(39));
...