Задача на решение с рекурсией

Пытаюсь разобраться с рекурсией. Вот задача. Дано неотрицательное целое число num. Складывать все входящие в него цифры до тех пор, пока не останется одна цифра.

Для числа 38 процесс будет выглядеть так:

3 + 8 = 11
1 + 1 = 2

Результат: 2

function addDenim(num)
{
 let strNum = String(num);
  if (num < 10) {
    return num;
  }
  return Number(strNum[0]) + addDenim(Number(strNum.slice(1, strNum.length)));
}

console.log(addDenim(38)); // 11

В моём решении выдаёт число 11, хотя должен выдавать 2. Проблема в return, но я никак не могу понять, почему эта строка "Number(strNum[0]) + addDenim(Number(strNum.slice(1, strNum.length)))" выдаёт значение 8, и следовательно сразу выкидывает меня из итерации. В чём тут дело. Очень хочется разобраться.


Ответы (3 шт):

Автор решения: Grundy

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

Осталось вызвать ее для полученного результата.

function addDenim(num) {
  let strNum = String(num);
  if (num < 10) {
    return num;
  }
  num = Number(strNum[0]) + addDenim(Number(strNum.slice(1, strNum.length)));

  return addDenim(num);
}

console.log(addDenim(38)); // 11

→ Ссылка
Автор решения: Aziz Umarov

Так думаю проще, добиться желаемого результата

function addDenim(num)
{
  return num < 10? num: addDenim(num%10 + addDenim(num/10|0));
}

console.log(addDenim(38)); // 2
console.log(addDenim(111)); // 3

→ Ссылка
Автор решения: gil9red

Нужно было в рекурсию помещать результат сложения обоих чисел, а не только вторую часть

Попробуйте:

function addDenim(num) {
    if (num < 10) {
        return num;
    }
    let strNum = String(num);
    return addDenim(
        Number(strNum[0]) + Number(strNum.slice(1, strNum.length))
    );
}

console.log(addDenim(38)); // 2

Немного функционального стиля, плюс честное сложение всех цифр в числе:

function addDenim(num) {
    if (num < 10) {
        return num;
    }
    let sum = String(num).split('').map(Number).reduce((a, b) => a + b)
    return addDenim(sum);
}

console.log(addDenim(38)); // 2

→ Ссылка