Problema con algoritmo

-

Buenas noches, estaba yo haciendo unos ejercicios de programación nocturnos, cuando he llegado a uno extraño, que no había visto nunca.
Se trata de una función definida recursivamente, en la que ya he conseguido resolver una parte.
Sin embargo, la otra me trae de cabeza.

La función es tal que asi:
0; si N < 0;
1; si N = 0;
(X + Y ) *F(X2; Y 2;N div 2); si N mod 2 = 1;
F(X2; Y 2;N div 2) + X * Y * F(X2; Y 2; (N div 2) - 1); si N mod 2 = 0:

Trata de hacer un sumatorio de potencias, es en el último caso donde me da problemas.
Ah, no se pueden usar acciones ni funciones, si no sería sencillo.

¿Alguna idea?

-

He podido resolver ootr oparecido, pero es en la suma de F(x2,y2,ndiv2)+xyF(x2,y2,ndiv2)-1) donde me atasco.
Por ahora, el algoritmo va tal que asi:

var x,s,y:real; n:integer;
begin
s:=1;
writeln('introduce x');
readln(x);
writeln('Introduce y');
readln(y);
writeln('introduce n');
readln(n);

while n<>0 do
begin
if (n mod 2=1) then begin
s:=s(x+y); x:=xx; y:=yy; n:=(n div 2);
end
else begin
s:=(s
xy); x:=xx; y:=y*y; n:=(n div 2)-1;
end;

end;
readln;

writeln('El resultado de la suma de la progresi¢n es', s);

readln;
end.

LOc0

Edito. Tienes que pasar de recursivo a iterativo. Mmm...

Salu2 ;)

-

En la segunda condición, no sé que poner.
El uso de la función dos veces con distintos valores de n en la misma condición me lia.

LOc0

No me hagas mucho caso pero creo que necesitas un bucle while independiente por cada llamada a f().

Me piro a sobar. Sorry si no te he servido de mucho, pero a estas horas no está la cabeza para ciertas cosas :)

Salu2 ;)

-

Gracias de todas maneras ^.

LOc0

Ni caso. Mañana lo miraré tranquilamente.

Salu2 ;)

-

Ahahaha, idea feliz y obvia.

Se pueden separar los dos sumandos, hacer cada uno por su lado y volverlos a sumar al final :P.

EDIT mañanero: No funciona tampoco asi xD.De esa manera solo funciona el caso n=2, el resto falla xD.

javithelong

He creido entender que tu problema es esta línea:
F(X2; Y 2;N div 2) + X * Y * F(X2; Y 2; (N div 2) - 1); si N mod 2 = 0:

No entiendo lo de X2 Y2, pero vamos, si tienes que hacer iterativa esa suma de 2 recursiones, tienes que hacer 2 bucles con las mismas condiciones que el 1º (ya que es la misma función) pero una para cada recursión. Intenta algo asi:

while( blablabla) {
----> metes aqui en una variable el resultado de toda la iteración de la 1ª recursion (ej: aux1:integer)
}
while (blablabla){
----> metes aqui el resultado de la 2ª iteración (ej: aux2:integer)
}
Y aqui haces aux1+aux2

Todo esto dentro del bucle grande, claro. No se si me he expresado con claridad, o si funcionará ^, pero así a primera vista es lo que se me ha ocurrido.

Saludos

EDIT: Si es lo que dices que has hecho en #8 comprueba que esté el código correcto con un debugger.

-

#9 Eso es lo que he hecho xD, dos bucles separados, y sin embargo no sale, ya que tendríamos el doble del valor de s al multipilcar por el caso de nmod2=1 dos veces :S.

LOc0

Tienes que USAR UNA TABLA e ir calculando todos los valores desde el n=0 hasta n=N.

Salu2 ;)

-

#11 Ya lo pensé, le pregunté al profesor y me dice que no, que tiene su solución sin tablas xDD.
Es la reencarnación de Hitler ese hombre.

javithelong

Oie, y te deja usar variables? o algo? xD

Pues colega, si consigues la solución ponla, porque no se me ocurre nada más :s

Un comentario na mas:
0; si N < 0;
1; si N = 0;
Tienes puesto al principio un par de ifs para salir en esos casos? en plan

if (n=0) s=s+1; break;
if (n<0) break;

(o tampoco puedes usar breaks xD)

EDIT: No recuerdo sin en pascal habia breaks... supongo que habrá algo parecido...

-

Si, claro que deja usar variables xD.
Ya posetearé el resultado cuando lo obtenga :S (Esperemos que sea pronto)

gF

y no lo puedes resorver mediante un algoritmo recursivo?

m0rG

#15

"Ah, no se pueden usar acciones ni funciones, si no sería sencillo."

A ver si leemos mejor xD.

Usuarios habituales

  • m0rG
  • gF
  • -Itachi-
  • javithelong
  • LOc0