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