Ver Mensaje Individual
  #112 (permalink)  
Antiguo 17/12/2014, 04:30
Pantaláimon
 
Fecha de Ingreso: julio-2006
Ubicación: Barcelona
Mensajes: 244
Antigüedad: 17 años, 9 meses
Puntos: 32
Respuesta: Petando la pila. Problemas y retos usando recursividad.

Buenas

Fijándome en los códigos de la función descompon, estoy viendo implementaciones que no respetan del todo lo que pedí en el enunciado. O al menos que no siguen la idea que quise expresar con esa norma.
Cita:
Cuando ver != 0 se mostrará la salida tal como he explicado.
Si ver == 0 se ejecuran los calculos que hayáis implementado pero no se mostrará nada por la salida estándar.
La idea de tener una bandera ver era para poder ponerla a 0 y medir el tiempo de ejecución del código sin las interferencias que pudiera producir mostrar la salida estándar. El problema es que hay códigos que dejan de hacer ciertos cálculos que no son meramente de mostrar los resultados cuando ver == 0.

Un ejemplo claro es el de kutcher donde hay el siguiente código:
Código C++:
Ver original
  1. if(ver)
  2.         cout << a << " = " << factor_primo(a, 2, fact) << endl;
si ver == 0 no se ejecutará factor_primo que, a parte de instrucciones de visualización, también ejecuta otras instrucciones como la función comprobar_primo que son 100% de cálculo.

La interpretación de leosan ha sido tratar el flag ver como un exponente. O almenos eso parece en la función imprimir. De hecho, el código de leosan no implementa lo pedido ya que llama a descompon ( 1500 , 1550, 0 ) y esto no debería mostrar ninguna salida por pantalla.

La implementación de eferion es la que es más parecida a lo que quería. Si ver == 0 el cálculo de los factores y su exponente se hace siempre. En cambio el conjunto de cálculos sobre cómo mostrarlos (encapsulados en la macro IMPRIMIR) no se hacen.

Yo quizá buscaba la interpretación más estricta, haciendo todos los cálculos, incluso ejecutando las condiciones que calculan cómo mostrar la descomposición de factores de los números y sólo evitando las funciones de salida estándar como printf, puts, el operador << de C++.

Pongo el código de eferion modificado para poner de ejemplo de la idea que quiero expresar:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. #define IMPRIMIR( base, exponente, primerPrimo, ver ) \
  4.   if ( primerPrimo == 0 && ver) printf( " *" ); \
  5.   if ( exponente == 1 && ver) printf( " %d", base ); \
  6.   else if ( exponente > 0 && ver) printf( " %d^%d", base, exponente )
  7.  
  8. int ComprobarPrimo( int* numero, int candidato )
  9. {
  10.   if ( *numero % candidato == 0 )
  11.   {
  12.     *numero /= candidato;
  13.     return 1 + ComprobarPrimo( numero, candidato );
  14.   }
  15.   return 0;
  16. }
  17.  
  18. void bucleChequeo( int numero, int candidato, int primerPrimo, int ver )
  19. {
  20.   int exp = ComprobarPrimo( &numero, candidato );
  21.   if ( exp > 0)
  22.   {
  23.     IMPRIMIR( candidato, exp, primerPrimo, ver);
  24.     primerPrimo = 0;
  25.   }
  26.  
  27.   candidato += 2;
  28.   if ( numero > 1 )
  29.     bucleChequeo( numero, candidato, primerPrimo, ver );
  30. }
  31.  
  32. void descompon(int a, int b, int ver)
  33. {
  34.   int actual = a;
  35.   int exp = ComprobarPrimo( &actual, 2 );
  36.  
  37.   if ( ver ) printf( "%d =", a );
  38.   IMPRIMIR( 2, exp, 1, ver );
  39.  
  40.   bucleChequeo( actual, 3, exp == 0, ver );
  41.  
  42.   if ( ver )
  43.     printf ( "\n" );
  44.  
  45.   if ( a < b )
  46.     descompon( ++a, b, ver );
  47. }
  48.  
  49. int main() {
  50.     descompon(2, 1000, 0);
  51.     return 0;
  52. }

Un saludo!
__________________
github.com/xgbuils | npm/xgbuils

Última edición por Pantaláimon; 17/12/2014 a las 04:41