Listas + recursividad

Iniciado por Persephone, 2 Noviembre 2019, 17:07 PM

0 Miembros y 1 Visitante están viendo este tema.

Persephone

Hola! Estoy con un ejercicio de la universidad con listas y recursividad, hay que rellenar donde esta de color púrpura. Lo he sacado de forma iterativa pero con recursividad no tengo claro que sea de esta manera. Nos lo piden en formato algoritmico.
Pongo el enunciado: Rellena los recuadros para finalizar el diceño de la función recursiva sum_squares que calcula la suma de los n primeros números al cuadrado a partir de un número d.
       Ejemplo: sum_squares (4,3) devuelve 32+42+52+62=86

function sum_squares (n: integer, d: integer): integer
Pre: { 0 ≤ n, 0 < d }
var
           res: integer;
fvar
           if n = 0 then
                 break;
      else
                res :=  (d*d)  + sum_squares( n-1, d+1);
      end if
           return res;
end function

Gracias!

K-YreX

Bueno... antes de nada avisarte que este foro es específico para C/C++. Para cualquier otro tema como es el pseudocódigo, tienes el foro de "Programación General".

La segunda cosa a tratar es que entendía lo que querías decir hasta que has llegado al ejemplo... No puedes representar un ² como un 2 normal porque anda que no hay diferencia de 32 a 3²... :rolleyes:

Y por último, la función en cuestión. La función tiene dos parámetros el número inicial y la cantidad de sumandos que tendrá la operación. Si te fijas, tienes (4,3) que significa sumar 4 números al cuadrado empezando por el 3. Cuando ya tengas sumado el 3² te quedarás por sumar 3 números más y el primero será el 4 porque el 3 ya está sumado. Por lo que empezaría siendo (4,3) y después sería (3,4), después (2,5), luego (1,6) y finalmente (0,7) que como con el 0 haces un break no se llegaría a sumar el 7² por lo que parece que de primeras está bien.

Sin embargo el valor de <res> en el último caso es desconocido por lo que te podría salir cualquier cosa y no te daría el resultado esperado. Tienes dos formas de solucionar esto, una es asignando el valor 0 a <res> al principio de la función para que así en el caso base (n == 0) se devuelva un 0 que no afecta a la suma o usar un <return> en vez de un <break>

SI n == 0 ENTONCES
    return 0
FIN SI
return (d*d) + sum_squares(n-1, d+1)

Al usar <return> el <else> se vuelve innecesario y la creación de la variable <res> también.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

Persephone

Es verdad! no me fijé que al pegar se quedaba el 2 así jeje
Lo del pseudocódigo lo tendré en cuenta para la siguiente, y gracias! Tiene sentido, voy a probar las dos maneras  ;D