Foros del Web » Programación para mayores de 30 ;) » Java »

Recursividad JAVA: Terminación anticipada

Estas en el tema de Recursividad JAVA: Terminación anticipada en el foro de Java en Foros del Web. Estoy intentando hacer un programa que me diga si un número es primo o no, pero no termino de entender donde está el fallo. Estoy ...
  #1 (permalink)  
Antiguo 16/05/2010, 12:37
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 17 años, 5 meses
Puntos: 1
Recursividad JAVA: Terminación anticipada

Estoy intentando hacer un programa que me diga si un número es primo o no, pero no termino de entender donde está el fallo. Estoy usando recursividad:

Código:
import java.io.*;

public class EsPrimo {
	static boolean EsPrimoRecursivo(int n, int divisor, boolean resul){
		divisor = divisor-1;
		if(divisor>1)
			if(n%(divisor) != 0) EsPrimoRecursivo(n, divisor, resul); 
			else resul= false;                             //Terminación anticipada.
		
		return resul;
		
	}
	
	static boolean EsPrimo(int num){
		int aux;
		aux = num;
		boolean resultado = true;
		return EsPrimoRecursivo(num, aux, resultado);
	}
	
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader linea = new BufferedReader(new InputStreamReader(System.in));
		int numero;
		
		System.out.print("Numero: ");
		numero = Integer.parseInt(linea.readLine());
		System.out.print("Primo: " + EsPrimo(numero));
	}

}
Lo he puesto en el debug y mirando paso a paso lo que hace, y lo que no entiendo es: ¿por qué si llega a la instrucción: resul = false; //Terminación anticipada, realiza también la fase de vuelta de la recursividad?
¿No se supone que, si no hago ahí ninguna llamada recursiva, se tiene que romper la recursividad y salir?
__________________
Blog: http://a-dream-of-dragon.blogspot.com
  #2 (permalink)  
Antiguo 17/05/2010, 01:03
Avatar de caelus  
Fecha de Ingreso: mayo-2010
Ubicación: /home
Mensajes: 91
Antigüedad: 14 años, 6 meses
Puntos: 5
Respuesta: Recursividad JAVA: Terminación anticipada

Tendrías que arreglar algunos asuntos allí, al menos así lo hice funcionar yo.
Código Codigo:
Ver original
  1. import java.io.*;
  2.  
  3. public class EsPrimo {
  4.     boolean resultado = true;
  5.     boolean EsPrimoRecursivo(int n, int divisor, boolean resul){
  6.        
  7.         divisor = divisor-1;
  8.         if(divisor>1){
  9.            
  10.             if(n%(divisor) != 0){
  11.                 EsPrimoRecursivo(n, divisor, resul);
  12.            
  13.         }else{
  14.                 resultado = false;          //Terminación anticipada.
  15.               }
  16.      }
  17.         return resultado;
  18.     }
  19.    
  20.     boolean EsPrimo(int num){
  21.         int aux;
  22.         aux = num;
  23.         boolean resultado = true;
  24.         return EsPrimoRecursivo(num, aux, resultado);
  25.     }
  26.    
  27.     public static void main(String[] args) throws NumberFormatException, IOException {
  28.         BufferedReader linea = new BufferedReader(new InputStreamReader(System.in));
  29.         int numero;
  30.         EsPrimo m = new EsPrimo();
  31.         System.out.print("Numero: ");
  32.         numero = Integer.parseInt(linea.readLine());
  33.         System.out.print("Primo: " + m.EsPrimo(numero));
  34.     }
  35.  
  36. }
  #3 (permalink)  
Antiguo 18/05/2010, 01:26
 
Fecha de Ingreso: mayo-2007
Mensajes: 200
Antigüedad: 17 años, 5 meses
Puntos: 1
Respuesta: Recursividad JAVA: Terminación anticipada

Muchas gracias. A ver si me puedes responder un par de dudas que tengo todavía por favor.

1º En la sentencia: EsPrimo m = new EsPrimo(); "EsPrimo" es un método de la clase, no un contructor, ¿qué es lo que hace esto exactamente?

resultado = false; //Terminación anticipada. Se supone que es una terminación anticipada de la recursividad, pero sin embargo, sigue haciendo la fase de vuelta. ¿Por qué sucede esto? ¿Cómo se puede hacer un método recursivo que sólo haga la fase ida y se corte sin realizar la fase de vuelta?

Muchas gracias.
__________________
Blog: http://a-dream-of-dragon.blogspot.com
  #4 (permalink)  
Antiguo 19/05/2010, 02:37
Avatar de caelus  
Fecha de Ingreso: mayo-2010
Ubicación: /home
Mensajes: 91
Antigüedad: 14 años, 6 meses
Puntos: 5
Respuesta: Recursividad JAVA: Terminación anticipada

Sobre la primera pregunta
Los métodos de las clases que tengan el mismo nombre que la clase son tomados como constructores. La sentencia Esprimo m=new Esprimo(); instancia la clase Esprimo (creas un objeto llamado m de tipo EsPrimo() y así puedes usar los métodos de la clase) por eso da problemas el IDE y te obligó a tener que hacer los métodos static.
Sobre la segunda, hay 2 métodos uno adentro del otro, entonces cuando sale del interno todavía está en el externo, de donde tiene que salir para poder terminar el ciclo.

SAludos

Etiquetas: recursividad
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 09:33.