2010-05-16 84 views
5

Busco un método para hacer cálculos como:Encuentra la suma de números enteros consecutivos w/o el uso de bucle en JavaScript

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

Si pasa number como 5 función debe devolver la suma de 1+2+3+4+5. Me pregunto si es posible prescindir de los bucles.

+0

http://en.wikipedia.org/wiki/Summation#Some_summations_of_polynomial_expressions Es el cuarto. –

+0

@ FK82 - No, no lo es. Necesitas leer la pregunta de nuevo. –

+0

@Simon: tiene razón, ** producto ** no ** **. Gracias. :-) – FK82

Respuesta

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

puedo pensar en dos formas fáciles para mí recordar esta fórmula:

  • pensar en añadir los números de ambos extremos de la secuencia: 1 yn, 2 y n-1, 3 y n-2, etc. Cada una de estas pequeñas sumas termina siendo igual a n + 1. Ambos extremos terminarán en el medio (promedio) de la secuencia, por lo que debe haber n/2 de ellos en total. Entonces sum = (n + 1) * (n/2).

  • Hay tantos números antes del promedio (que es (1 + n)/2) como hay después, y agregar un par de números que son equidistantes a este promedio siempre resulta en el doble del promedio, y hay son n/2 pares, por lo que suma = (n + 1)/2 * 2 * n/2 = (n + 1)/2 * n.

Usted puede bastante fácilmente extender el razonamiento anterior a un número de partida diferente, que le da: suma (números de A a B, ambos inclusive) = (a + b)/2 * (b-a + 1) .

+2

Esto pasa por alto la línea que atribuye esta fórmula a Carl Friedrich Gauss. – Tomalak

8

¡Claro que sí!

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

nico tiene razon! Es mejor utilizar una función matemática siempre que sea posible, ya que representan una forma más corta de realizar un cálculo complejo que de otra manera requerirá ciclos y/o recursión. Si necesita un alto rendimiento en un cálculo, intente encontrarlo en una función matemática como la de arriba. –

2

O puede utilizar un enfoque recursivo, que aquí es redundante dado que hay una fórmula simple. ¡Pero siempre hay algo genial y mágico sobre la recursión!

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

Editado para tratar con 0!

+4

Pase 100000 a eso y disfrute :) – nico

+2

Creo que el placer está más en escribirlo y pensar en la magia en lugar de verla hacer su trabajo. :) –

+1

esto es horrible ... una función matemática tan fácil no debería calcularse con recursividad. gran rendimiento golpeado con un gran número parámetro! –

Cuestiones relacionadas