Java - Calcular divisores, Forma Recursiva

 
Vista:

Calcular divisores, Forma Recursiva

Publicado por konika_bn (10 intervenciones) el 17/11/2015 12:26:54
Buenas, tengo que hacer este problema de forma recursiva. Sólo se me ocurre implementarlo, pero de forma normal, es decir sin recursión. Si me pudiérais ayudar os lo agradecería.

La factorización de números enteros consiste en descomponer un número compuesto (no primo) en divisores no triviales que cuando se multiplican dan el número original. Para nuestro propósito académico queremos implementar una función recursiva que devuelva el número de divisores distintos de un número dado. Por ejemplo, el número 20 tiene 6 divisores: 1, 2, 4, 5, 10 y 20.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Calcular divisores, Forma Recursiva

Publicado por Xampy (16 intervenciones) el 17/11/2015 13:02:18
Buenas he visto ya otro tema del mismo tipo en esta pagina.

Al fin de cuentas tienes que decirle al programa que divida hasta que el divisor sea 0 o menor.
Si es cero es un numero valido.
Si no, no lo es.

Los vas guardando en un array los que son validos.

Espero que te ayude la respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Calcular divisores, Forma Recursiva

Publicado por Xampy (16 intervenciones) el 17/11/2015 13:32:40
He estado dando una vuelta y he visto esto espero que te ayude.

https://es.wikipedia.org/wiki/Recursi%C3%B3n
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular divisores, Forma Recursiva

Publicado por konika_bn (10 intervenciones) el 17/11/2015 13:43:16
Buenas Xampy.
Sí la idea que tengo en mente desde hace varios días es esa que me has dado de ir dividiendo desde el propio número hasta el 1 (que sería en este problema el caso base de la recursión).
Pero el caso recursivo, de ir dividiendo y guardando los divisores en un array para posteriormente devolverlo, no lo veo tan claro a la hora de implementarlo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Calcular divisores, Forma Recursiva

Publicado por Xampy (16 intervenciones) el 17/11/2015 16:04:57
Buenas de nuevo.

Yo craeria un metodo como este y lo usaria no se si exactamente funciona ya que lo he hecho en notepad y tendria que mirar a ver si tiene errores si tiene alguno ya lo arrglas.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public boolean recursivo(int numero){
int[] numeros, resultado;
	//vamos a ver los divisores
	for(dividendo=1 ; dividendo>=numero-1; dividendo++){
		// No me acuerdo si es mayo o menor
		while(resultado<=1){
		resultado=numero/dividendo;
			if(resultado==1){
				//este caso es cuando el resto es 0 en este caso metemos el numero en el array de numeros.	
			}else{
				//este caso es cuando no es fijo
			}
		}
 
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Calcular divisores, Forma Recursiva

Publicado por Xampy (16 intervenciones) el 17/11/2015 16:26:07
Creo que me he equibocado en el ultimo if y tiene que comprabr el

if(resultado==1){

if(resultado==0){

no lo se ya que no he probado el codigo no lo puedo probar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular divisores, Forma Recursiva

Publicado por konika_bn (10 intervenciones) el 17/11/2015 16:29:50
Lo he probado y no me funciona :(
Lo máximo que me he acercado ha sido a esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public static Collection<? extends Integer> factorizarNumEntero_NF(int numero){
 
	List<Integer> divisores = new ArrayList<Integer>();
 
	if(numero==1){
		divisores.add(1);
	}else {
		for(int i = numero; i>1; i--){
			if(numero%i==0){
				divisores = (List<Integer>) factorizarNumEntero_NF(numero/i);
				divisores.add(numero);
			}
		}
	}
 
	return divisores;
}

Esto sigue estando mal, ya que por ejemplo para el numero=10, me devuelve todos los divisores excepto el 2
Para el numero=40, me devuelve como divisores el 1,5,10,20,40, pero no devuelve el 2,4 y 8.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Calcular divisores, Forma Recursiva

Publicado por Xampy (16 intervenciones) el 17/11/2015 16:52:09
cuando haces

divisores = (List<Integer>) factorizarNumEntero_NF(numero/i);

Estas borrando la lista y empezandola de nuevo.
¿Has probado a debuguear?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular divisores, Forma Recursiva

Publicado por konika_bn (10 intervenciones) el 17/11/2015 17:20:27
Sí he probado a debuguear pero sigo sin dar con la solución. ¿Entonces sabría como sería para ir añadiendo todos y no empezar de nuevo la lista borrándola anteriormente ?
Antes de nada, darte mil gracias por todas tus contestaciones. Sigo insistiendo porque es bastante importante el dar con la solución a este problema.
Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Calcular divisores, Forma Recursiva

Publicado por Xampy (16 intervenciones) el 17/11/2015 17:26:41
Prueba cambiar
divisores = (List<Integer>) factorizarNumEntero_NF(numero/i);
por
divisores.ad((List<Integer>) factorizarNumEntero_NF(numero/i));

Es que no tengo donde probar el codigo si no ya estaria sacado.

No te preocupes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular divisores, Forma Recursiva

Publicado por konika_bn (10 intervenciones) el 17/11/2015 17:36:17
Tampoco :( :( .
Ahora haciendo ese cambio que me has dicho (creo haberlo hecho anteriormente), por ejemplo, para el numero=10 me devuelve
la lista [1,10,1,2,10,1,5,10].

Tendrías donde probar el código a lo largo del día? Muchísimas gracias y un saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lawliet
Val: 308
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Calcular divisores, Forma Recursiva

Publicado por Lawliet (303 intervenciones) el 17/11/2015 18:37:34
Hola...

No estoy seguro si esto es lo que necesitas pero espero te sea de utilidad.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static void main(String[] args) {
	List<Integer> listaNumeros = new ArrayList<Integer>();
	int numero = 20;
 
	for(int i = 1; i <= numero; i++){
		if((numero % i) == 0){
			listaNumeros.add(i);
		}
	}
 
	for (Integer mostrar : listaNumeros) {
		System.out.println(mostrar);
	}
}

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular divisores, Forma Recursiva

Publicado por konika_bn (10 intervenciones) el 17/11/2015 18:42:34
Buenas.
Sí esa la idea, incluso el resultado es el correcto. Pero no está calculado de forma recursivo.
Es decir, lo que busco es una función que por un lado tenga un caso base(el cual sería cuando el número ingresado es 1, que se calcularía directamente) y por otro lado el caso recursivo en el cual hay que invocar a la propia función para que devuelva los distintos divisores.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lawliet
Val: 308
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Calcular divisores, Forma Recursiva

Publicado por Lawliet (303 intervenciones) el 17/11/2015 19:27:00
Hola...

Espero sea esto lo que buscas ya que si nos basamos de la definición de algoritmo recursivo, esto sería lo correcto.

https://es.wikipedia.org/wiki/Algoritmo_recursivo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Recursividad {
 
	public Recursividad(){
		numDivisores(20, 1);
	}
 
	public static void main(String[] args) {
		new Recursividad();
	}
 
	public void numDivisores(int numero, int divisor){
		if (divisor <= numero){
			if((numero % divisor) == 0){
				System.out.println(divisor);
				numDivisores(numero, divisor + 1);
			} else {
				numDivisores(numero, divisor + 1);
			}
		}
	}
}

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Calcular divisores, Forma Recursiva

Publicado por konika_bn (10 intervenciones) el 17/11/2015 19:49:36
Y en este caso, donde se contempla el caso base?Es decir, que si el número es 1, solo tiene un divisor, él mismo.
Muchas gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lawliet
Val: 308
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Calcular divisores, Forma Recursiva

Publicado por Lawliet (303 intervenciones) el 17/11/2015 20:02:36
Hola...

Prácticamente es algo redundante ingresar un caso base ya que sin importar el número aun cuando el dígito sea 1, siempre nos devolverá los divisores correspondientes, sin embargo, si lo necesitas con el caso base prácticamente tendrías que realizar una validación del número a dividir, si el número es 1 entonces imprima 1, caso contrario realice todo el proceso que observas en el código. Siento que sería algo parecido a esto.

1
2
3
4
5
6
7
8
9
10
11
12
if (numero == 1){
	// Codigo base
} else {
	if (divisor <= numero){
		if((numero % divisor) == 0){
			System.out.println(divisor);
			numDivisores(numero, divisor + 1);
		} else {
			numDivisores(numero, divisor + 1);
		}
	}
}

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Calcular divisores, Forma Recursiva

Publicado por konika_bn (10 intervenciones) el 17/11/2015 21:22:24
Sabrías distinguir si es una función recursiva no final o recursiva final. Debo implementar dos diferentes, es decir, una no final dónde en el caso recursivo haya una operación de combinación y otra final dónde ya no haya dicha operación. Y posteriormente pasarlo a forma iterativa.
Un saludo y gracias.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Calcular divisores, Forma Recursiva

Publicado por konika_bn (10 intervenciones) el 18/11/2015 12:19:08
Lawliet este tipo de función que me diste esta bien ( es una función recursiva final), puesto que, en el caso recursivo no hay ninguna operación de combinación. Sabrías como sería no final? Podría ser que no exisitiera dicha función como no final?
Un saludo y gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Lawliet
Val: 308
Ha mantenido su posición en Java (en relación al último mes)
Gráfica de Java

Calcular divisores, Forma Recursiva

Publicado por Lawliet (303 intervenciones) el 18/11/2015 17:06:53
Hola...

Has investigado sobre en Internet algún ejemplo o algoritmo para una función recursiva no final, ya que partiendo de ahí podríamos atacar el problema de forma exacta y no tener que adivinar.

No eh trabajado con recursividad y mucho menos con los términos final o no final, el código que proporcione anteriormente esta basado en un algoritmo recursivo que encontré tal y como te lo indico al principio del comentario, por lo que no sabría con exactitud que es lo que necesitas.

Sería un excelente inicio investigaras los conceptos y proporcionar tu investigación para poder ver como plasmar esa idea a líneas de código ^^.

Sin mas que comentar, cualquier duda y/o inconveniente, aquí estamos.

Suerte!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar