Функция которая считает сумму цифр числа через рекурсию

423
15 октября 2021, 14:30

Нужно посчитать сумму цифр в числе использую рекурсию ( 123 = 1 + 2 + 3 = 6). Я решил задачу так , но в браузере не появляется модальное окно , долго искал где ошибка , нашёл в интернете похожее решение, но всё равно не могу понять где ошибка и что вообще я сделал не так

function sumNumber(n){
    n = `${n}`;
    let arr = n.split('');
    if ( arr.lenght == 1) {
        return arr[0];
    }
    else {
        return   arr[0] + sumNumber(arr.slice(1));
    }
}
alert(sumNumber(123));
Answer 1

Что я сделал не так...

function sumNumber(n){ // Название функции не совсем отражает суть
    n = `${n}`;
    let arr = n.split(''); // Массив уже изначально содержит строки, не числа
    if ( arr.length == 1) {
      return arr[0];
    }
    else {
      // arr[0] — строка. Нужно превращать его в число, т.к. в таком виде
      // будет получаться "1" + 2 = "12" — и оно никогда не будет заканчиваться.
      return arr[0] + sumNumber(arr.slice(1));
      // arr.slice(1) — массив строк. Функция должна получать число, а не массив.
      // Массив превращается в строку, получается писец.
    }
}
alert( sumNumber(123) );

Правильный вариант:

function sumDigits(n) {
  n = `${n}`;
  if( n.length == 1 ) return +n; // Плюсик перед строкой - превращает её в число.
  
  return +n[0] + sumDigits( n.slice(1) );
  // n - всё еще строка (содержащая число).
  // +n[0] — к первой цифре добавляем результат вызова той же функции 
  // для оставшихся цифр ( slice(1) берет всю строку, кроме первого символа )
}
console.log( sumDigits(1234) )

P.s. Такие задачи стоит решать через рекурсию только в учебных целях.
В реальной жизни будет уместно использовать обычный цикл. Например:

function sumDigits(n) {      
  let sum = 0;
  for( let digit of `${n}` ){ // прямо тут, сразу превращая n в строку
    sum += +digit;
  }      
  return sum;
}
console.log( sumDigits(1234) );

А, например, используя регулярные выражения, можно посчитать сумму всех цифр в любой строке. \d от слова digit, означает совпадение с любой цифрой. .match() возвращает массив совпадений.

function sumDigits(n) {
  return `${n}`.match(/\d/g).reduce( (sum, digit) => sum + +digit, 0 );
}
console.log( sumDigits( -1234.5 ) );

Answer 2

function sum(x, n){ 
  if( n == 1 ){ 
    return x 
  } else{ 
    return x * sum( x, n - 1 ); 
  } 
 
} 
 
console.log( sum(2, 3)  )

READ ALSO
Порядок действий в React.js с fetch

Порядок действий в React.js с fetch

Написал следующий код по примерам с fetch:

246
Как отменить стандартное действие при нажатии на кнопку "Назад" сразу после открытия страницы

Как отменить стандартное действие при нажатии на кнопку "Назад" сразу после открытия страницы

Хочу отменить стандартное действие при нажатии на кнопку "Назад", есть функция, которая отслеживает нажатие на кнопку "Назад"

166
Объединить 2 массива в один

Объединить 2 массива в один

как объединить их в thisbufArr, чтобы ключами были буквы из leftArray а значение брались по букве из letterArray Пытался пушом но не получалось

151