Как рекурсивно уменьшить число, умножив его цифры? - PullRequest
2 голосов
/ 22 января 2020

Теперь у нас есть эта рекурсивная функция:

function digitsMultipication(number) {
  let strNumber = number.toString();
  let firstNum = parseInt(strNumber[0]);

  if(strNumber.length==1){
    return firstNum
  }else{
    let x = ''
    for(i=1;i<strNumber.length;i++){
        x += strNumber[i]
    }
    x = parseInt(x)
    return firstNum * digitsMultipication(x);
  }
}

// TEST CASES
console.log(digitsMultipication(66)); // 36

Как мы можем отредактировать эту функцию, так как мы хотим, чтобы выходное условие было буквально одним ди git. Поскольку 36 по-прежнему 2 цифры, и мы хотим, чтобы функция повторялась до тех пор, пока выходное значение не будет равно одному ди git, что равно 8.

66 => 6 * 6 = 36,
36 => 3 * 6 = 18,
18 => 1 * 8 = 8 (требуемый конечный результат)

Ответы [ 2 ]

2 голосов
/ 22 января 2020

Вы имели в виду что-то подобное?

const
  get = num => {
      const sum = [...num + ''].reduce((sum, n) => n * sum);
      return sum < 10 ? sum : get(sum);
  },
  result = get(66);

console.log(result);

Более эффективный способ - избежать строкового преобразования и использовать только математику:

const
  get = num => {
      let sum = 1;
      
      while (num) {
        sum *= num % 10;
        num = parseInt(num / 10);
      }
      
      return sum < 10 ? sum : get(sum);
  },
  result = get(66);

console.log(result);

И даже сохранить память и избежать рекурсии:

const
  get = num => {
    let sum = 1;

    for (;;) {
      sum *= num % 10;
      num = parseInt(num / 10);

      if (num <= 0) {
        if (sum < 10) return sum;

        num = sum;
        sum = 1;
      }
    }
  },
  result = get(66);
  
console.log(result);
1 голос
/ 22 января 2020

Сначала напишем две простые функции:

  1. mult - кратно a и b

    const mult = (a, b) => a * b;
    
    mult(3, 4);
    //=> 12
    
  2. prod - умножает вместе все элементы списка.

    const prod = (...ns) => ns.reduce(mult);
    
    prod(1, 2, 3, 4);
    //=> 24
    

Как мы можем разбить число (мы предполагаем положительное целое число) на его цифры?
то есть от 123 до [1, 2, 3]. Есть много способов сделать это. Для этого ответа я просто буду использовать:

const to_digits = n => Array.from(String(n), Number);

to_digits(123);
//=> [1, 2, 3]

Теперь давайте проведем рефакторинг вашей функции (я назвал ее prod_digits):

const prod_digits =
  n =>
      Math.abs(n) < 10  ? n
    : n < 0             ? prod_digits(prod(-1, ...to_digits(Math.abs(n))))
                        : prod_digits(prod(...to_digits(n)));
                        
                        
console.log(prod_digits(66));  //=> 8
console.log(prod_digits(-66)); //=> -8
console.log(prod_digits(6));   //=> 6
console.log(prod_digits(-6));  //=> -6
<script>
const to_digits = n => Array.from(String(n), Number);
const mult = (a, b) => a * b;
const prod = (...n) => n.reduce(mult);
</script>

Оптимизация (и)

В качестве упражнения вы можете реализовать два условия раннего выхода:

  1. Если to_digits возвращает список, содержащий 0, просто возвращает 0
  2. Если to_digits возвращает список, состоящий только из 1, просто возвращает 1
...