| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Jue 14 May, 2009 3:08 pm Asunto: Salir de una funcion recursiva |
|
|
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 |
|
 |
Carlos J. Fernandez Master


Registrado: 27 Oct 2004Mensajes: 574
|
Publicado: Jue 14 May, 2009 3:34 pm Asunto: |
|
|
Has probado con Return?
Un abrazo.
Carlos |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Jue 14 May, 2009 4:53 pm Asunto: |
|
|
Gracias por contestar....
He probado con return a secas y me da error... no entiendo como deberia de usarla.....
Gracias |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Jue 14 May, 2009 9:21 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Vie 15 May, 2009 7:09 am Asunto: |
|
|
| 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 . _________________ Un saludo
Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA) |
|
| Volver arriba |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Vie 15 May, 2009 8:12 am Asunto: |
|
|
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 |
|
 |
neg1414 Master

Registrado: 31 Ene 2007Mensajes: 284
|
Publicado: Vie 15 May, 2009 9:05 am Asunto: |
|
|
| Correccion: Ta = 6 |
|
| Volver arriba |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Lun 18 May, 2009 12:30 am Asunto: |
|
|
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 |
|
 |
|