2010-05-16 4 views
5

Я ищу способ сделать расчеты как:Найти сумму последовательных целых чисел без использования цикла в JavaScript

function sumIntegerUpTo(number) { 
    return 1+2+3+...+number; 
} 

Если вы передаете number в 5 функция должна возвратить сумму 1+2+3+4+5. Мне интересно, можно ли обойтись без петель.

+0

http://ru.wikipedia.org/wiki/Summation#Some_summations_of_polynomial_expressions Это четвертый. –

+0

@ FK82 - Это не так. Вам нужно снова прочитать вопрос. –

+0

@Simon: Вы правы, ** сумма ** нет ** товар **. Благодарю. :-) – FK82

ответ

7
function sumIntegerUpTo(number) { 
    return (1 + number) * number/2; 
} 

Я могу думать о двух простых способов для меня вспомнить эту формулу:

  • Подумайте о добавлении номера с обоих концов последовательности: 1 и N, 2 и N-1, 3 и n-2 и т. д. Каждая из этих маленьких сумм заканчивается равным n + 1. Оба конца заканчиваются в середине (в среднем) последовательности, поэтому их должно быть n/2. Итак, sum = (n + 1) * (n/2).

  • Число до числа (до 1 + n)/2) равно количеству, которое равноудаленно этому среднему, всегда равно удвоенному среднему значению, n/2 пары, поэтому sum = (n + 1)/2 * 2 * n/2 = (n + 1)/2 * n.

Вы можете довольно легко расширить эти рассуждения на другой стартовый номер, что дает вам: SUM (цифры от а до Ь, включительно) = (а + Ь)/2 * (Ь-а + 1) ,

+2

Это пропустит линию, которая приписывает эту формулу Карлу Фридриху Гаусу. – Tomalak

8

Конечно, это так!

1+2+3+...+n = n * (n+1)/2 
+0

nico - это правильно! Лучше использовать математическую функцию, где это возможно, потому что они представляют собой более короткий путь к некоторому сложному вычислению, которое в противном случае потребует циклов и/или рекурсии. Если вам нужна высокая производительность при вычислении, попробуйте найти ее в математической функции, как указано выше! –

2

Или вы можете использовать рекурсивный подход, который здесь избыточен, если имеется простая формула! Но в рекурсии всегда есть что-то классное и волшебное!

function addToN(n) 
{ 
    if(n==0) return 0; 
    else return n + addToN(n-1); 
} 

Отредактировано для связи с 0!

+4

Пройдите 100000 к этому и наслаждайтесь :) – nico

+2

Я думаю, что наслаждение больше написано и думает о магии, а не наблюдает за ее действиями! :) –

+1

это ужасно ... такая простая математическая функция не должна рассчитываться с рекурсией. огромная производительность с большим числом параметров! –

Смежные вопросы