Ejercicio Recursivo

Hace tiempo habia visto este ejercicio interesante:

El cuadrado de un número N puede calcularse con la suma de los N primeros números impares. Escriba un algoritmo recursivo para obtener el cuadrado de un entero positivo N basándose en esta propiedad.
Nota: Tenga en cuenta que el n-ésimo número impar se puede obtener como 2 * n - 1.

n = 3 | n-ésimo = 2 * 3 - 1 = 5 | n al cuadrado = 1 + 3 + 5 = 9
n = 4 | n-ésimo = 2 * 4 - 1 = 7 | n al cuadrado = 1 + 3 + 5 + 7 = 16

int cuadrado_impar(N)
{
if((2 * N - 1) == 1)
return(1);
else
N+=cuadrado_impar(2 * N - 1);
return(N);
}

Estará bién está solución?

envido escribió:

Hace tiempo habia visto este ejercicio interesante:

El cuadrado de un número N puede calcularse con la suma de los N primeros números impares. Escriba un algoritmo recursivo para obtener el cuadrado de un entero positivo N basándose en esta propiedad.
Nota: Tenga en cuenta que el n-ésimo número impar se puede obtener como 2 * n - 1.

n = 3 | n-ésimo = 2 * 3 - 1 = 5 | n al cuadrado = 1 + 3 + 5 = 9
n = 4 | n-ésimo = 2 * 4 - 1 = 7 | n al cuadrado = 1 + 3 + 5 + 7 = 16

int cuadrado_impar(N)
{
if((2 * N - 1) == 1)
return(1);
else
N+=cuadrado_impar(2 * N - 1);
return(N);
}

Estará bién está solución?

Tengo que volver a repasar lógica o esto no debería funcionar...

Tienes una funcion entera llamada cuadrado_impar que recibe como parámetro el número N.
Bajo el supuesto de N=3, se compara 5 con 1 (2*3-1=5) que es falso, pasando al else.
En el else sumas a N (3) el resultado de la llamada a la función cuadrado_impar(5)

Bajo el supuesto de 5, se compara 9 con 1 (2*5-1=9) que es falso, pasando al else.
En el else sumas a N (5) el resultado de la llamada a la función cuadrado_impar(9)

Bajo el supuesto de 9, se compara 17 con 1 (2*9-1=17) que es falso, pasando al else...

Esto funciona así?

int f(n){

    if(n==1)
      return 1;
    else
      return 2*n-1 + f(n-1);
}

Una propiedad muy interesante :)

m__x_ escribió:
int f(n){

    if(n==1)
      return 1;
    else
      return 2*n-1 + f(n-1);
}

Una propiedad muy interesante :)

Eso está mucho mejor. :)

Gracias m__x_ por el detalle que faltaba, estaba casi cerca!

Se me pasó lo de decrementar la N... Saludos!

envido escribió:

Gracias m__x_ por el detalle que faltaba, estaba casi cerca!

Se me pasó lo de decrementar la N... Saludos!

estabas pensando mal la funcion, vos cada vez que llamabas recursivamente a la función, la llamabas con

funcion(2*n-1){...}

entonces cada llamado, la función obtenía un parámetro mas grande y nunca iba a llegar el caso degenerado ( donde n = 1 ) que es el que detiene la recursión, tenes que tener en cuenta como se modifica el parámetro cada vez que se llama a la funcion para que esta pueda en algún momento terminar. y no entre en un bucle infinito.