Задача на решение с рекурсией
Пытаюсь разобраться с рекурсией. Вот задача. Дано неотрицательное целое число 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 шт):
В данном случае функция выполняет всего один проход, а именно складывает цифры начального числа.
Осталось вызвать ее для полученного результата.
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
Так думаю проще, добиться желаемого результата
function addDenim(num)
{
return num < 10? num: addDenim(num%10 + addDenim(num/10|0));
}
console.log(addDenim(38)); // 2
console.log(addDenim(111)); // 3
Нужно было в рекурсию помещать результат сложения обоих чисел, а не только вторую часть
Попробуйте:
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