2011-05-09 9 views
6

Hola estoy tratando de refrescar mi mente con un poco de recurrencia. Quiero agregar todos los números de 'inicio' a 'final' inclusive.Agregue recursivamente secuencia de números

Es decir, si inicio fue de 1, y al final era 5. A continuación, la respuesta sería 1 + 2 + 3 + 4 + 5 = 15

Hasta ahora tengo esta

int calc(int start, int end){ 
    if(start > end) 
     return total; 
    else{ 
     total = total + start; 
    return sum1(start++, end); 
    } 
} 

Su no funciona (obtengo fallo seg) ¿Qué estoy haciendo mal?

EDIT: Siento que estoy usando las mismas variables en mi código real, cuando escribí esto terminé refrendarlas como inicio/final y olvidé cambiar todo el código.

+0

utilizan operadores de incremento cuando una 'start + 1' funcionaría igual de bien. – hugomg

Respuesta

7

¿Cuáles son las variables from y to dentro de su función? Tal vez utilice algunos globales en lugar de utilizar start y end y es por eso que tiene el problema? Además, ¿por qué está usando sum1 dentro de la función calc en lugar de calc?

Tal vez puedas probar:

int calc(int start, int end){ 
    if(start > end) 
     return 0; 
    else 
     return start + calc(start + 1, end); 
} 
+0

Gracias :) Tu primera respuesta que tiene (inicio ++, final) en ella causó un error de segmentación, pero comenzó + 1 trabajado. ¿Por qué es esto? – Sean

+4

debería haber sido ++ start. preincremento y no incremento posterior. start ++ nunca incrementará el valor pasado a la función recursiva y dará como resultado un ciclo infinito. De ahí la falla de segmentación. –

+0

respuesta impresionante Spendor, gracias: D – Sean

3

Para empezar, no está utilizando sus parámetros de función (inicio, final), que está utilizando (de, a) en su lugar. Supongo que de y para son variables globales o su código no se compilará. Además, ¿dónde está declarado total?

Esto debería funcionar mejor:

int calc(int start, int end){ 
    if(start > end) 
     return 0; 
    else{ 
     return start + calc(start+1, end); 
    } 
} 
+0

Creo que necesitas '++ start' en tu llamada recursiva. –

+1

Debe ser 'start + 1', en realidad. 'start ++' es incorrecto porque podría evaluarse antes del 'start +' anterior en la instrucción. – ikegami

+0

Oh, ustedes tienen razón, pensé que se veía raro, debería haberlo cambiado. – GWW

0

Esto funciona muy bien para.

int calc(int from, int to) 
{ 
    if (from >= to) return to; 
    return from + calc(from + 1, to); 
} 
+1

'from ++' es incorrecto porque podría evaluarse antes del 'de 'anterior en la instrucción. Debería ser 'desde + 1 '. – ikegami

+1

no es de ++ sino ++ de. (preincremento) –

+1

lo mismo se aplica a '++ from'. '++ from' es incorrecto porque podría evaluarse antes o después del' from' anterior en la instrucción. Como regla general, uno no debería cambiar y usar una variable en una expresión. – ikegami

3

Por cierto, aquí es una solución más eficiente:

int calc(int from, int to) 
{ 
    if (from == 0) 
     return to * (to+1)/2; 
    else 
     return calc(0, to) - calc(0, from); 
} 

Es incluso recursiva! Bueno, hasta que se simplifica aún más a

int calc(int from, int to) 
{ 
    return (to * (to+1) - from * (from+1))/2; 
} 

Eso es porque f (n) = n + ... + 3 + 2 + 1 = n (n + 1)/2

Nunca
+0

Creo que la mejor solución para este problema es presentada por ikegami. A veces no tiene que tomar los problemas como están y pensar en diferentes formas de calcular lo mismo. Lo que ikegami ha demostrado es una implementación simple del algoritmo para la suma de una serie a un cierto número. Funciona de manera bastante eficiente también. – Abhay

Cuestiones relacionadas