numero primo con recursion

publicado por: Anonymous

No se porque este código explota en tiempo de ejecución, alguna idea?

#include <iostream>
using namespace std;

bool esPrimo(int number, int cont = 1, int div = 0)
{
    if (number % cont == 0) 
    {
        div+=1;
    } 
    else if (cont == number) {
        return (div < 3) ? 1: 0;
    }
    return esPrimo(number, cont++, div);
}

int main()
{
    int primo = esPrimo(3);
    cout << primo << endl;
    return 0;
}

No se si entendi bien la parte de los parametros esPrimo(int number, int cont = 1, int div = 0), el problema que tengo es con la sintaxis y el hecho de que con la recursion no puedo almacenar los datos una vez se haya ejecutado la funcion, asi que para eso le asigno de nuevo estas variables en los parametros, hasta donde entendi, al inicializarlos en el mismo parametro hace permitible que ya no los llame, porque se irian reemplazando. Pero no estoy muy seguro.
Lo que quiero conseguir es usar una funcion esPrimo() que no llame mas de un parametro en main y que no use variables externas, punteros, referencias ni listas. Si pueden ayudarme, les estaria agradecido.

solución

Solución 1: usa variables estáticas.

No usamos nada fuera de la función, y ésta solo recibe 1 parámetro:

#include <iostream>

bool esprimo( int x ) {
  static int tmp = 0;

  if( x == 1 ) {
    tmp = 0;
    return true;
  }

  if( !tmp ) {
    tmp = x;
    --x;
  }

  if( !( tmp % x ) ) {
    tmp = 0;
    return false;
  }

  return esprimo( --x );
}

int main( void ) {
  using namespace std;

  cout << "esprimo( 3 ) = " << esprimo( 3 ) << endl;
  cout << "esprimo( 7 ) = " << esprimo( 7 ) << endl;
  cout << "esprimo( 10 ) = " << esprimo( 10 ) << endl;

  return 0;
}

esprimo( 3 ) = 1
esprimo( 7 ) = 1
esprimo( 10 ) = 0

Las variables static tienen un tiempo de vida igual al tiempo de vida de tu aplicación. Es lo mismo que las declararas fuera de main( ), y conservan para siempre el último valor que les asignes. Al declararla dentro de una función, no aseguramos que no sea vista desde otros puntos del código, con lo que ganamos seguridad.

Solución 2: argumentos con valor por defecto.

Si te fijas, tu problema indica

que no llame mas de un parametro en main

No se indica que la función solo reciba 1, sino que se llame desde main( ) con 1.

#include <iostream>

bool esprimo( int x, int tmp = 0 ) {
  if( x == 1 )
    return true;

  if( !tmp ) {
    tmp = x;
    --x;
  }

  if( !( tmp % x ) )
    return false;

  return esprimo( --x, tmp );
}

int main( void ) {
  using namespace std;

  cout << "esprimo( 3 ) = " << esprimo( 3 ) << endl;
  cout << "esprimo( 7 ) = " << esprimo( 7 ) << endl;
  cout << "esprimo( 10 ) = " << esprimo( 10 ) << endl;

  return 0;
}

esprimo( 3 ) = 1
esprimo( 7 ) = 1
esprimo( 10 ) = 0

En C++ se permiten argumentos con valores por defecto. Si al llamar a la función no les asignas tu un valor directamente, el compilador los pone en tu lugar. Eso quiere decir que la función sigue recibiendo el número de argumentos indicado, aunque no lo indiquemos explicitamente. Su misión es facilitar el uso de las funciones, ahorrandonos el escribir argumentos que, la mayoría de las veces, serán siempre el mismo … o, como en este caso, proporcionar funcionalidad no documentada. Para cualquiera que no vea el código, la función esprimo( ) solo recibe 1 argumento.

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *