problemilla en c++

Iniciado por pABL012, 3 Septiembre 2013, 19:21 PM

0 Miembros y 4 Visitantes están viendo este tema.

eferion

Es necesario que una función se llame de forma recursiva 40 veces ???

Lo mismo sería más lógico que no fuese recursiva y encerrar ese código en un bucle.

Eternal Idol

Cita de: pABL012 en  5 Septiembre 2013, 12:13 PM
Vaya. Pues si, efectivamente estoy usando una función recursiva. Pero me parecería raro que fuese ahí el fallo porque únicamente le introduje unas variables nuevas que uso para comparar en condicionales...

Listo, el problema esta ahi sin duda, lo mas probable es que la condicion que hacia retornar sin llamarse a si misma a la funcion recursiva ya no se esta cumpliendo nunca.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

pABL012

Cita de: eferion en  5 Septiembre 2013, 13:11 PM
Es necesario que una función se llame de forma recursiva 40 veces ???

Lo mismo sería más lógico que no fuese recursiva y encerrar ese código en un bucle.

La función recursiva puede llamarse 40 veces, 100 o 2. Eso no depende de mi. Como ya he dicho se trata de hacer una estadística, y el llamar la función recursiva depende de números aleatorios. La primera llamada a la función recursiva es la que se hace 40 veces aprox antes de morir el programa. Vamos que antes de morir ha entrado y salido del "bucle de recursividad" unas 40 veces de forma satisfactoria. Ojala fuese tan fácil como cambiar la recursividad por un bucle!  :)


Cita de: Eternal Idol en  5 Septiembre 2013, 13:30 PM
Listo, el problema esta ahi sin duda, lo mas probable es que la condicion que hacia retornar sin llamarse a si misma a la funcion recursiva ya no se esta cumpliendo nunca.

Pues parece que tienes razón porque al eliminar la recursividad de momento no me está dando fallos, pero la recursividad me es necesaria. Voy a probar a quitarle variables inútiles de esas que se quedan sueltas de cuando uno está construyendo el programa la primera vez para evitar que se desborde la pila. Esto que dices de la condición que hacia retornar no lo entiendo. ¿Puedes poner un ejemplo?

Muchas gracias por las respuestas, y un saludo a todos.

Eternal Idol

Ejemplo simple:
http://c.conclase.net/curso/?cap=024

Código (c++) [Seleccionar]
/* Función recursiva para cálculo de factoriales */
int factorial(int n) {
   if(n < 0) return 0;
   else if(n > 1) return n*factorial(n-1); /* Recursividad */
   return 1; /* Condicion de terminacion, n == 1 */
}
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

eferion

Cita de: pABL012 en  5 Septiembre 2013, 13:55 PM
La función recursiva puede llamarse 40 veces, 100 o 2. Eso no depende de mi. Como ya he dicho se trata de hacer una estadística, y el llamar la función recursiva depende de números aleatorios. La primera llamada a la función recursiva es la que se hace 40 veces aprox antes de morir el programa. Vamos que antes de morir ha entrado y salido del "bucle de recursividad" unas 40 veces de forma satisfactoria. Ojala fuese tan fácil como cambiar la recursividad por un bucle!  :)


Pues parece que tienes razón porque al eliminar la recursividad de momento no me está dando fallos, pero la recursividad me es necesaria. Voy a probar a quitarle variables inútiles de esas que se quedan sueltas de cuando uno está construyendo el programa la primera vez para evitar que se desborde la pila. Esto que dices de la condición que hacia retornar no lo entiendo. ¿Puedes poner un ejemplo?

Muchas gracias por las respuestas, y un saludo a todos.

Aprovechando el ejemplo de Eternal....

/* Función recursiva para cálculo de factoriales */
int factorial(int n)
{
   if(n < 0) return 0;
   else if(n > 1) return n*factorial(n-1); /* Recursividad */
   return 1; /* Condicion de terminacion, n == 1 */
}

/* Función sin recursividad para cálculo de factoriales */
int factorial(int n)
{
   if(n < 0)
      return 0;

   int total = 1;

   while ( n > 1 )
   {
      total *= n;
      n--;
   }

   return total;
}

pABL012

Definitivamente teníais razón. El problema era la recursividad. Al final lo he solucionado acotando el número de veces que puede llamarse a si misma la función.

Muchas gracias a todos por vuestra ayuda, y un saludo.

Eternal Idol

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

amchacon

Todo algoritmo recursivo puede programarse como un algoritmo iterativo.

De todas formas, 40 me parecen muy pocas veces.
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar