elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: [Aporte] Mejores practicas en Java


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  AYUDA CON RECURSIVIDAD
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: AYUDA CON RECURSIVIDAD  (Leído 355 veces)
alpachino98

Desconectado Desconectado

Mensajes: 20


Valar Morghulis


Ver Perfil
AYUDA CON RECURSIVIDAD
« en: 8 Enero 2018, 13:08 »

Hola buenas, tengo un problema con una función recursiva, se mete pero nunca sale. No se si tengo un error en la sintaxis o en la condición de parada. Si alguien ve algún fallo y puede ayudarme...Gracias

Código:
void FncOpenPoint(Tablero Partida, int fil, int col)
{
if(fil>0&&fil<FIL&&col>0&&col<COL)
{
if(Partida[fil][col].mine==false)
if(Partida[fil][col].num=0&&Partida[fil][col].flag==false)
{
Partida[fil][col].visible=true;
/*for(int i=fil-1;i<fil+1;i++)
for(int j=col-1;j<col+1;j++)
FncOpenPoint( Partida,  fil,  col); */
    FncOpenPoint( Partida,  fil-1,  col-1);
FncOpenPoint( Partida,  fil-1,  col);
FncOpenPoint( Partida,  fil-1,  col+1);
FncOpenPoint( Partida,  fil,  col-1);
FncOpenPoint( Partida,  fil,  col+1);
FncOpenPoint( Partida,  fil+1,  col-1);
FncOpenPoint( Partida,  fil+1,  col);
FncOpenPoint( Partida,  fil+1,  col+1);
}
else
if(Partida[fil][col].mine!=true)
Partida[fil][col].visible=true;
}
return;
}
}

Como es un buscaminas tiene que ir recorriendo la matriz de forma recursiva hasta que encuentre una mina o llegue al limite del tablero. Se exige que sea de forma recursiva. Gracias


En línea

CalgaryCorpus

Desconectado Desconectado

Mensajes: 85


Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #1 en: 8 Enero 2018, 13:44 »

Supongo que es que estas chequeando que flag es false para continuar, pero no lo cambias nunca.

Cambialo. O usa visible, que si lo cambias.


En línea

do-while


Desconectado Desconectado

Mensajes: 1.269


¿Habra que sacarla de paseo?


Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #2 en: 8 Enero 2018, 15:02 »

Se te ha colado una asignación (=0) donde debería haber una comparacion (==0):
Código:
if(Partida[fil][col].num=0&&Partida[fil][col].flag==false)

El resto no lo he mirado.
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
alpachino98

Desconectado Desconectado

Mensajes: 20


Valar Morghulis


Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #3 en: 8 Enero 2018, 15:15 »

Se te ha colado una asignación (=0) donde debería haber una comparacion (==0):
Código:
if(Partida[fil][col].num=0&&Partida[fil][col].flag==false)

El resto no lo he mirado.

Tienes razón pero sigue sin funcionar aún asi. La condición de parada es que encuentre los límites del tablero o que encuentre una mina. Pero hace dos cosas, solo me marca como visible la primera y no hace nada mas o se mete en bucle y no sale. Gracias!
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.000



Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #4 en: 8 Enero 2018, 19:15 »

Si nos pudieras decir qué es cada miembro de Partida, qué hace y cuáles son las condiciones de parada te podríamos ayudar mejor. Yo voy muy a ciegas.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
alpachino98

Desconectado Desconectado

Mensajes: 20


Valar Morghulis


Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #5 en: 8 Enero 2018, 19:44 »

Si nos pudieras decir qué es cada miembro de Partida, qué hace y cuáles son las condiciones de parada te podríamos ayudar mejor. Yo voy muy a ciegas.

Código:
struct Estados
{
bool mine;
bool visible=false;
bool flag=false;
int num=0;

};

Las condiciones de parada de la funcón recursiva son que encuentre una casilla con un valor diferente a 0 o encuentre una mina.
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.000



Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #6 en: 8 Enero 2018, 20:03 »

Vale, ya entiendo. Verás: tal y como está no se detendrá nunca porque visible no lo tienes en cuenta a la hora de parar. Imagina que tienes dos casillas contiguas que no tienen nada. El jugador marca la de la izquierda y la hace visible y el código pasa después a la de la derecha. El código la hace visible y en algún momento volverá a mirar la de la izquierda. Como no tiene condición de parada el que una casilla sea visible este bucle se repetira (izquierda, derecha, izquierda, derecha, ...) hasta que la pila se llene de llamadas y el programa se detenga.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
alpachino98

Desconectado Desconectado

Mensajes: 20


Valar Morghulis


Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #7 en: 8 Enero 2018, 20:31 »

Vale, ya entiendo. Verás: tal y como está no se detendrá nunca porque visible no lo tienes en cuenta a la hora de parar. Imagina que tienes dos casillas contiguas que no tienen nada. El jugador marca la de la izquierda y la hace visible y el código pasa después a la de la derecha. El código la hace visible y en algún momento volverá a mirar la de la izquierda. Como no tiene condición de parada el que una casilla sea visible este bucle se repetira (izquierda, derecha, izquierda, derecha, ...) hasta que la pila se llene de llamadas y el programa se detenga.

En eso creo que tienes toda la razón pero aun poniendo la condición de parada de visible sigue haciendo lo mismo de quitarme solo una si le asigno visible=true en el inicio o meterse en bucle si lo meto dentro de los ifs

Código:
void FncOpenPoint(Tablero Partida, int fil, int col)
{
Partida[fil][col].visible=true;
if(!Partida[fil][col].mine)
if(Partida[fil][col].num==0&&!Partida[fil][col].flag&&!Partida[fil][col].visible)
{
//cout<<"yeee"<<endl;
//Partida[fil][col].visible=true;
//system("PAUSE");
//do{
if(fil>0||col>0){
FncOpenPoint( Partida,  fil-1,  col-1);
//cout<<"yeeeffffffffffffffffffffffffffffffffffffffffff"<<endl;
FncOpenPoint( Partida,  fil-1,  col);
FncOpenPoint( Partida,  fil-1,  col+1);
FncOpenPoint( Partida,  fil,  col-1);
FncOpenPoint( Partida,  fil,  col+1);
FncOpenPoint( Partida,  fil+1,  col-1);
FncOpenPoint( Partida,  fil+1,  col);
FncOpenPoint( Partida,  fil+1,  col+1);
}//while (fil<0&&fil>FIL&&col<0&&col>COL);
/*for(int i=fil-1;i<fil+1;i++)
for(int j=col-1;j<col+1;j++){
FncOpenPoint( Partida,  i,  j);
//cout<<"yeee"<<endl;
}*/
//system("PAUSE");
}
else{
if(Partida[fil][col].mine!=true)
Partida[fil][col].visible=true; }
}


Código:
void FncOpenPoint(Tablero Partida, int fil, int col)
{

if(!Partida[fil][col].mine)
if(Partida[fil][col].num==0&&!Partida[fil][col].flag&&!Partida[fil][col].visible)
{
//cout<<"yeee"<<endl;
Partida[fil][col].visible=true;
//system("PAUSE");
//do{
if(fil>0||col>0){
FncOpenPoint( Partida,  fil-1,  col-1);
//cout<<"yeeeffffffffffffffffffffffffffffffffffffffffff"<<endl;
FncOpenPoint( Partida,  fil-1,  col);
FncOpenPoint( Partida,  fil-1,  col+1);
FncOpenPoint( Partida,  fil,  col-1);
FncOpenPoint( Partida,  fil,  col+1);
FncOpenPoint( Partida,  fil+1,  col-1);
FncOpenPoint( Partida,  fil+1,  col);
FncOpenPoint( Partida,  fil+1,  col+1);
}//while (fil<0&&fil>FIL&&col<0&&col>COL);
/*for(int i=fil-1;i<fil+1;i++)
for(int j=col-1;j<col+1;j++){
FncOpenPoint( Partida,  i,  j);
//cout<<"yeee"<<endl;
}*/
//system("PAUSE");
}
else{
if(Partida[fil][col].mine!=true)
Partida[fil][col].visible=true; }
}
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.000



Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #8 en: 9 Enero 2018, 00:18 »

Cosillas:
Toda la parte del else te sobra ya que
Código:
if(!Partida[fil][col].mine)
es lo mismo que
Código:
if(Partida[fil][col].mine!=true)

El primer código está mal ideado ya que visible valdrá true y no podrá entrar en el segundo if:
Código:
Partida[fil][col].visible=true;
if(!Partida[fil][col].mine)
  if(Partida[fil][col].num==0&&!Partida[fil][col].flag&&!Partida[fil][col].visible)

También veo que la función no está terminada pues buscas más allá de los límites de la tabla, tal vez te pierdes por allí. Como depuración haz que la función te diga en qué casilla se encuentra.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
programerpro100%real

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: AYUDA CON RECURSIVIDAD
« Respuesta #9 en: 9 Enero 2018, 01:41 »

He intentado solucionar tu problema pero me he atascado en lo mismo que tú, aunque no este solucionado, te pongo el código que he creado por si te puede servir de algo.
Código:
int i,j;

Partida[fil][col].visible=true;
for (i=-1; i<2; i++)
for (j=-1; j<2; j++)
if (((fil+i>=0)&&(fil+i<FIL))&&((col+j>=0)&&(col+j<COL)))
if (Partida[fil][col].visible == true)

                                   /* si la casilla tampoco tiene adyacentes se hace una llamada
recursiva */
if (Partida[fil][col].visible == false&&Partida[fil][col].num==0){
FncOpenPoint(Partida,fil+i,col+j);
}
else
Partida[fil][col].visible=true;

Partida[fil+i][col+j].visible = true;
}
}
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ayuda con recursividad
.NET
eagle17 2 1,767 Último mensaje 1 Marzo 2009, 10:29
por bitarray
ayuda recursividad
.NET
Choclito 2 1,378 Último mensaje 14 Mayo 2009, 03:38
por Choclito
AYUDA problema de RECURSIVIDAD en C++
Programación C/C++
anapamell 2 772 Último mensaje 6 Mayo 2013, 20:04
por anapamell
Ayuda con Recursividad
.NET
40 3 849 Último mensaje 14 Septiembre 2015, 18:19
por DarK_FirefoX
Ayuda recursividad « 1 2 »
Programación C/C++
JUHC 10 2,020 Último mensaje 8 Agosto 2016, 16:41
por AlbertoBSD
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines