Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Duda en el uso de Vectores

Resulta que me dan este problema a resolver por el metodo de divide y venceras

Se tienen n bolas de igual tamaño, todas ellas de igual peso salvo dos más pesadas, que a su vez pesan lo mismo. Como único medio para dar con dichas bolas se dispone de una balanza romana clásica. Diseñar un algoritmo que permita determinar cuáles son dichas bolas, con el mínimo posible de pesadas

mi solucion es esta

En la clase principal hice este metodo
public class Principal {

public Principal() {
}

public Vector<Integer> metodo(Vector<Integer> arr, int ini, int fin) {
Vector<Integer> res = new Vector<Integer>();
if (arr.size() == 2) {
if (arr.get(0) > arr.get(1)) {
res.add(ini);
return res;
} else if (arr.get(0) izq = metodo(arr, ini, arr.size() / 2);
Vector<Integer> der = metodo(arr, arr.size() / 2, fin);

res.addAll(der);
res.addAll(izq);
return res;
}
}

y en main hice esto

public static void main(String[] args) {
Vector<Integer> test = new Vector<Integer>();

test.add(2);
test.add(4);
test.add(2);
test.add(2);
test.add(2);
test.add(2);
test.add(2);
test.add(4);
test.add(2);
test.add(2);


Principal pr = new Principal();
Vector<Integer> res = pr.metodo(new Vector<Integer>(test), 0, 9);
for (int i = 0; i < res.size(); i++) {
System.out.print(res.get(i));

}

Pero cuando lo corro me da un StackOverflowError, en la parte del vector, y no entiendo por que. Si alguien puede ayudarme con eso le estaria bien agradecido

octubre 6, 2011 | Registered Commenterwizard

Tu método
public Vector<Integer> metodo(Vector<Integer> arr, int ini, int fin)
se llama a sí mismo, desde su mismo bloque de código. De ahí el StackOverflowError.

octubre 6, 2011 | Unregistered Commenterchoces

Después de publicar el mensaje anterior, he caído en la cuenta de que tal vez no se entienda del todo el porqué del error, y el sentido de la respuesta.

Lo que sucede es que se produce una recursión infinita, porque no hay ninguna condición declarada que la detenga, una vez que se ha iniciado.

public String getEntero(final int entero) {
return getEntero(Integer.toString(1234);
}

Éste es un ejemplo típico de recurrencia infinita, que ocasionará un StackOverflowError con toda seguridad.
Algo similar ocurre con tu código cuando se ejecuta metodo dentro de metodo.

octubre 6, 2011 | Unregistered Commenterchoces

Hola,
tu algoritmo para resolverlo (a parte del bucle infinito) no es el que menos pesadas hace. Además si n=2 las dos bolas son las que pesan más (no hay otras bolas con las que comparar).
Por otro lado, te recomendaría que hicieses grupos con las bolas y comparases el peso de esos grupos, en vez de comparar bola con bola.

un saludo

octubre 6, 2011 | Registered Commenterrobertiano