простая задачка,но что-то с рекурсией

ЗАДАЧА:реализуйте и экспортируйте по умолчанию функцию, которая работает следующим образом:

Дано неотрицательное целое число num. Складывать все входящие в него цифры до тех пор, пока не останется одна цифра.

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

3 + 8 = 11

1 + 1 = 2

Результат: 2

Примеры

addDigits(19); // 1
addDigits(38); // 2
addDigits(1259); // 8

Написал рекурсивную функцию,которая считает сумму, и если она двухзначная,то сумма передается в саму функцию. Вроде бы понятен каждый шаг, и все очевидно, но на некоторые числа он начинает выдавать "undefined". Вот говнокод:

var func = (numb) => {
    var str_my = String(numb);
    var summ = 0;
    for(var i = 0; i < str_my.length; i++){
        summ += Number(str_my[i]);
    }
    summ >= 10 ? func(summ) : return summ;
};

Буду рад любой помощи. Спасибо


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

Автор решения: Михаил Камахин

return надо ставить в двух местах. У вас происходила ошибка, потому что вы просто вызывали рекурсивную функцию, а не возвращали результат её работы.

Как работает код без второго return(там где вызов самой себя):

func(38);

function func(str) {
    str_my = '38'
    summ = 0
    summ = 11
    if (summ >= 10) { // summ  больше или равняется 10, правда
        // выполняется этот блок кода
        func(summ); // вызвалась эта функция
    } else {
        return summ;
    }
    // функция ничего не вернула, return не сработал ни один, соответственно результат работы этой функции равен undefined
}

Мой вариант без тернарного оператора:

function recursiveFunc(str) {
  str = String(str);
  
  let sum = 0;
  for (let i = 0; i < str.length; i++) {
    sum += +str[i];
  }
  if (sum >= 10) {
    return recursiveFunc(sum);
  } else {
    return sum;
  }
}

Или ваш код:

var func = (numb) => {
    var str_my = String(numb);
    var summ = 0;
    for(var i = 0; i < str_my.length; i++){
        summ += Number(str_my[i]);
    }
    return summ >= 10 ? func(summ) : summ;
};
→ Ссылка