Функция которая вычисляет сумму цифр числа
Перейти к содержимому

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

  • автор:

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

Мы хотим сделать этот проект с открытым исходным кодом доступным для людей во всем мире. Пожалуйста, помогите нам перевести это руководство на другие языки.

Светлая тема Тёмная тема
Поделиться

  • Учебник
  • Язык JavaScript
  • Продвинутая работа с функциями
  • Рекурсия и стек

Вычислить сумму чисел до данного

важность: 5

Напишите функцию sumTo(n) , которая вычисляет сумму чисел 1 + 2 + . + n .

sumTo(1) = 1 sumTo(2) = 2 + 1 = 3 sumTo(3) = 3 + 2 + 1 = 6 sumTo(4) = 4 + 3 + 2 + 1 = 10 . sumTo(100) = 100 + 99 + . + 2 + 1 = 5050

Сделайте три варианта решения:

  1. С использованием цикла.
  2. Через рекурсию, т.к. sumTo(n) = n + sumTo(n-1) for n > 1 .
  3. С использованием формулы арифметической прогрессии.

Пример работы вашей функции:

function sumTo(n) < /*. ваш код . */ >alert( sumTo(100) ); // 5050

P.S. Какой вариант решения самый быстрый? Самый медленный? Почему?

P.P.S. Можно ли при помощи рекурсии посчитать sumTo(100000) ?

Решение с помощью цикла:

function sumTo(n) < let sum = 0; for (let i = 1; i return sum; > alert( sumTo(100) );

Решение через рекурсию:

function sumTo(n) < if (n == 1) return 1; return n + sumTo(n - 1); >alert( sumTo(100) );

Решение по формуле: sumTo(n) = n*(n+1)/2 :

function sumTo(n) < return n * (n + 1) / 2; >alert( sumTo(100) );

P.S. Надо ли говорить, что решение по формуле работает быстрее всех? Это очевидно. Оно использует всего три операции для любого n, а цикл и рекурсия требуют как минимум n операций сложения.

Вариант с циклом – второй по скорости. Он быстрее рекурсии, так как операций сложения столько же, но нет дополнительных вычислительных затрат на организацию вложенных вызовов. Поэтому рекурсия в данном случае работает медленнее всех.

P.P.S. Некоторые движки поддерживают оптимизацию «хвостового вызова»: если рекурсивный вызов является самым последним в функции, без каких-либо других вычислений, то внешней функции не нужно будет возобновлять выполнение и не нужно запоминать контекст его выполнения. В итоге требования к памяти снижаются. Но если JavaScript-движок не поддерживает это (большинство не поддерживают), будет ошибка: максимальный размер стека превышен, так как обычно существует ограничение на максимальный размер стека.

  • © 2007—2024 Илья Кантор
  • о проекте
  • связаться с нами
  • пользовательское соглашение
  • политика конфиденциальности

Как получить сумму цифр из числа?

Дается функция:
function digitSum(n) <> где «n» любое целое число от 0 до бесконечности.

Только только обучаюсь JS. Дошел только до этого:

var reg = /\d/g; return +(n.match(reg));

Но не могу понять, числа который возвращаются это строка или массив? Что делать потом? Использовать reduce?
Дайте истинный путь, пожалуйста. Или может быть последовательность рассуждений. Или я, впринципе, в корне неправильно действую? Ответ не надо 🙂 Хочу подразобраться сам.

  • Вопрос задан более трёх лет назад
  • 17197 просмотров

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

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

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

Отслеживать
задан 31 окт 2019 в 21:46
331 3 3 серебряных знака 15 15 бронзовых знаков
первый раз в функцию приходит число, а в следующие вызовы?
31 окт 2019 в 21:50
length, не lenght. А вообще там бесконечная рекурсия.
31 окт 2019 в 21:53

3 ответа 3

Сортировка: Сброс на вариант по умолчанию

function sumNumber(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 = `$`; 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 в строку sum += +digit; >return sum; > console.log( sumDigits(1234) );

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

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

Python: Вычислить сумму цифр числа

Юн Сергей

Простой и избыточный вариант, для понимания логики вычисления суммы цифр числа.

# Вычисление суммы цифр трехзначного числа # Простой вариант для понимания логики вычисления import random a=random.randint(100, 999) print ('Случайное число =',a) s=a%10 a=a//10 print ('Первый проход, s =',s, 'a =',a) s=s+a%10 a=a//10 print ('Второй проход, s =',s, 'a =',a) s=s+a%10 a=a//10 print ('Третий проход, s =',s, 'a =',a) print ('Сумма цифр числа = ',s)

2. Вариант (цикл For)

# Вычисление суммы цифр трехзначного числа # Простой вариант для понимания логики вычисления import random a=random.randint(100, 999) # Получаем случайное трехзначное число из диапазона 100-999 print ('Случайное число "a" =',a) s=0 for i in range (3): s,a = s + a%10, a//10 print (i+1, ' проход: s = ',s, ', a = ',a, sep='') print ('Сумма цифр числа "a" = ',s)

3. Мини

import random a=random.randint(100, 999) print ('Случайное число "a" =',a) print (a//100 + a//10%10 + a%10)

4. Через map и sum

import random a=random.randint(100, 99999) b = map(int, str(a)) print('Дано число <>, сумма знаков числа = <>'. format(a, sum(b)))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *