javaScript_Recursive_Function _function sumToOne (число) - PullRequest
0 голосов
/ 01 августа 2020

Я пытаюсь реализовать sumToOne(num), который многократно суммирует заданное целое число, пока сумма не станет только одним di git - и вернет этот результат one-di git.

Пример: sumToOne(928) возвращает 1, потому что 9 + 2 + 8 = 19, затем 1 + 9 = 10, затем 1 + 0 = 1.

Все работает нормально, но мне не удалось перезвонить recursion(sum); .

Может ли кто-нибудь указать, что мне не хватает, потому что я новичок в рекурсивной функции logi c, пожалуйста?

function sumToOne(num) {

  const nxNum = String(num).split('');
  const length = nxNum.length;
  let sum = 0;

  let recursion = (sum) => {
    for (let i = 0; i < length; i++) {
      sum += + +nxNum[i];
    }
    if (sum < 10) {
      return sum;
    }
    recursion(sum);
  }
}
sumToOne(928);

Ответы [ 3 ]

0 голосов
/ 02 августа 2020

Иногда наличие внутренней функции помогает с рекурсией, но не в этом случае.

Если число, переданное в качестве аргумента, имеет как минимум две цифры, мы можем снова использовать нашу функцию и вернуть только фактическое число ( нарушение рекурсии), как только это всего лишь один di git (< 10):

function sumToOne(num) {
    if (num < 10) return num;

    const nxNum = String(num).split('');
    const length = nxNum.length;
    let sum = 0;

    for (let i = 0; i < length; i++) {
        sum += +nxNum[i];
    }

    return sumToOne(sum);
}

Обратите внимание, что вы можете преобразовать эту функцию в однострочную, используя Array.prototype.reduce (если удобочитаемость не имеет решающего значения) :

const sumToOne = n => n < 10 ? n : sumToOne(String(n).split('').map(Number).reduce((s, d) => s + d));
0 голосов
/ 02 августа 2020

Рекурсивные решения существуют везде!

const sumToOne = (n = 0) =>
  n < 10
    ? n
    : sumToOne(sum(digits(n)))
    
const sum = ([ n = 0, ...more ]) =>
  more.length === 0
    ? n
    : n + sum(more)

const digits = (n = 0) =>
  n < 10
    ? [ n ]
    : [ ...digits(Math.floor(n / 10)), n % 10 ]

console.log(sumToOne(928)) // 1
console.log(sumToOne(111)) // 3
console.log(sumToOne(999)) // 9
0 голосов
/ 01 августа 2020

Переменные, объявленные с ключевым словом let, могут иметь область действия блока.

Переменные, объявленные внутри блока {}, не могут быть доступны извне блока:

Пример

{
  let x = 2;
}

// Здесь нельзя использовать x

Попробуйте использовать свой код с ключевым словом var.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...