Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Salir de una funcion recursiva

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Salir de una funcion recursiva Responder citando

Tengo una fucion recursiva que calcula una serie de combinaciones.....
Cada combinacion es evaluada y si cumple una serie de condiciones debe de interrumpirse la ejecucion de la funcion recursiva salir y continuar el programa justo despues de donde se realizo la llamada a la funcion recursiva.



Código:
TForm1::Ciclo(int t,int Ta,int L,int x)
{

   while ( t <Ta> x)
       {
          VectorElementos[x] = t;
          Ciclo((t+1),Ta,L,(x+1));
       }
       else
       {
          VectorElementso[x] = t;

         //Donde deberia interrumpirse la recursividad
          if(CumpleCondicion(VectorElementos){Exit(0);}         

       }
       t++;
    }
 }


He utilizado exit(0) .. Sale de la funcion pero el programa que la contiene tambien se detiene(se termina su ejecucion).

Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Has probado con Return?

Un abrazo.

Carlos
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Gracias por contestar....

He probado con return a secas y me da error... no entiendo como deberia de usarla.....

Gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Programar una función recursiva no es fácil. El diseño cuidadoso es fundamental y siempre pensando en la recursividad. Debes depurarla bien y piensa que no saldrá "directamente" de la recursividad nunca. Me explico, debe deshacer el camino andado. Si entró 5 veces, saldra al quinto ciclo hacia atras. Piensa que si la condición la tienes puesta después de la salida y no se cumple, volverá a entrar. También piensa que los bucles pueden ser peligrosos, una función recursiva es, en sí misma, un bucle en cada reentrada. ¿Realmente te hace falte un bucle?

Puedes colocar una bandera que se active con la condición de salida y que si está activa no se vuelva a evaluar mas, de esa forma tu función sardrá. Esa bandera debe ser una variable declarada static. También puede ser una variable global, pero es menos elegante. No siempre hace falta la bandera.

Haz un debug paso a paso para analizar el porqué no te sale....

No puedo concretar mas porque no se lo que pretendes hacer con tu función.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

neg1414 escribió:
Gracias por contestar....

He probado con return a secas y me da error... no entiendo como deberia de usarla.....

Gracias

break;
Código:
TForm1::Ciclo(int t,int Ta,int L,int x)
{
     while ( t <Ta> x)
     {
          VectorElementos[x] = t;
          Ciclo((t+1),Ta,L,(x+1));
     }
     else
     {
          VectorElementos[x] = t;

          //Donde deberia interrumpirse la recursividad
          if(CumpleCondicion(VectorElementos)
               break;
          t++;
     }
}

Pero este código que has puesto no creo ni que te compile: el else no está asociado a ningún if; lo has puesto relacionado con el
Código:
while
.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Efectivamente existe un error en la transcripcion..el codigo correcto es


Código:
TForm1::Ciclo(int t,int Ta,int L,int x)
{
   
   while ( t <= (Ta-(L-x)))
    {
      if (L>x)
       {
          VectorElementos[x] = t;
          Ciclo((t+1),Ta,L,(x+1));
     }
     else
     {
          VectorElementos[x] = t;

          //Donde deberia interrumpirse la recursividad
 
          if(CumpleCondicion(VectorElementos)
               break;
          t++;
     }
}



La funcion lo que hace es calcular todas las combinaciones posibles en un conjunto de elementos cuyo numero total es Ta. Estas combinaciones deben de tener un numero de elementos L.

ejp:

Conjunto{abcdef} Ta=5;
Subconjuntos de 3 elementos L=3

abc
abd
abe
abf
acd
.....
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Correccion: Ta = 6
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Sigue habiendo errores en la transcripción de tu código, y cosas poco claras. No se sabe que tipo el VectorElementos. ¿Es un array de char?. ¿Como pretendes manejarlo?. ¿Pretendes sacar las combinaciones sin repetición de 6 elementos tomados tres a tres?.

Una función recursiva comenzará a salir cuando no se cumpla la condidión de la reentrada en si misma. Ese condicional, colocado como un if o condicional de un bucle, como parece que tienes, es obligatoria en este tipo de funciones, o no saldrá nunca.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.