Я ищу метод, чтобы сделать вычисления как:
function sumIntegerUpTo(number) {
return 1+2+3+...+number;
}
Если Вы передаете number
как 5
функция должна возвратить сумму 1+2+3+4+5
. Я задаюсь вопросом, возможно ли обойтись без циклов.
function sumIntegerUpTo(number) {
return (1 + number) * number / 2;
}
Я могу придумать два простых способа запомнить эту формулу:
Подумайте о сложении чисел с обоих концов последовательности: 1 и n, 2 и n-1, 3 и n-2 и т.д. Каждая из этих маленьких сумм в итоге будет равна n+1. Оба конца будут заканчиваться на середине (среднем) последовательности, поэтому всего их должно быть n/2. Таким образом, сумма = (n+1) * (n/2).
Перед средним числом (которое равно (1+n)/2) столько же чисел, сколько и после, и добавление пары чисел, равноудаленных от этого среднего, всегда приводит к удвоению среднего, а таких пар n/2, поэтому сумма = (n+1)/2 * 2 * n/2 = (n+1)/2*n.
Вы можете довольно легко распространить вышеприведенные рассуждения на другое начальное число, что даст вам: sum(numbers from a to b, inclusive) = (a+b)/2*(b-a+1).
Или вы можете использовать рекурсивный подход - который здесь избыточен, учитывая простую формулу! Но в рекурсии всегда есть что-то крутое и волшебное!
function addToN(n)
{
if(n==0) return 0;
else return n + addToN(n-1);
}
Отредактировано для работы с 0!