Programación General > Java
error Exception in thread "main" java.lang.StackOver
kas09013:
necesito ayuda, cree el programa se seleccion en forma recursiva, pero me marca el error Exception in thread "main" java.lang.StackOverflowError at SeleccionRecursivo.Seleccion(SeleccionRecursivo.java:22), eh leido el por qe de ese error y entendi que es por que el metodo se llama asi ismo y s esta ciclando pero no se como corregirlo alguien me puede ayudar? este es el codigo :
import java.io.*;//Libreria De Java Para Ingresar Datos Desde Teclado
class SeleccionRecursivo{// Nombre de La Clase
public static int Seleccion(int numeros[], int n){
int aux, i, l, posMayor;
if(n>1){
posMayor=0;
for(i=1; i<n;i++){
if(numeros>numeros[posMayor]){
posMayor=i;
}
aux=numeros[n-1];
numeros[n-1]=numeros[posMayor];
numeros[posMayor]=aux;
}
System.out.println(" ");
for (l=0; l<n; l++){// For Para Imprimir La Ordenacion De Los Numeros
System.out.print("|");
System.out.print(numeros[l] + "|");
}
}
return Seleccion(numeros, n-1);
}
public static void main(String args[])throws IOException{
BufferedReader res1=new BufferedReader(new InputStreamReader(System.in));
long tiempoInicio = System.currentTimeMillis();
int n;
int v[]=new int [15];//Declaracion De Arreglo
int res;// Declaracion De Variable
System.out.println ( "n||************** Metodo De Odenacion Seleccion **************|| n|| || ");
System.out.println ( "|| 1.-Cantidad De Numeros A Ordenar: ||");
System.out.print( "|| ");
n=Integer.parseInt(res1.readLine());//Lee Los Datos Introducidos Desde Teclado
System.out.println ( "|| 2.-Numeros A Ordenar: ||");
for (int i=0; i<n; i++){// Ciclo For Para Pedir que Indroduzca Los Valores
System.out.print( "|| ");
v=Integer.parseInt(res1.readLine());}// Lee y Almacena Los Datos Desde teclado En El Arreglo
System.out.println("|| 3.-Ordenacion De Numeros || n");
for (int i=0; i<n; i++){//Ciclo For Para La Ordenacion de Numeros
System.out.print("|");
System.out.print(v + "|");
}
System.out.println(" ");
res=Seleccion(v,n);//Llama All Metodo anterior Para Que Devuelva Datos
long totalTiempo = System.currentTimeMillis() - tiempoInicio;// Funcion Que Mide El Tiempo Y Calcula El Tiempo Total Empleado A Partir De La Diferencia Del Tiempo Inicial Y Final
System.out.println("n||El tiempo total de la ejecucion es :" + totalTiempo + " miliseg");
System.out.println ( "n||**********************************************************||");
}
}
tomas_sauron:
hola creo q lo q esta mal es la part recursiva o sea al programa vos le pones
if (n>1){
condiciones
}
deberia ir un else {
condiciones
}
ya q nada le impid al programa q c siga llamando hasta q n valga lo k sea
x ejemplo corrri tu programa en eclipse con el debug
y m dic q n x lo menos llega a valer -280
un ejemplo d recursividad es el factorial
si n =0 entonces n!=1
sino si n>=1 entonces n!=(n-1)!.n
y creo es mejor si trabajas con vectores
pasarle la primera posicion y la ultima
y preguntar las condiciones en base a esas posiciones
bah yo lo hacia asi m andaba :D
noc si m expliq bien sino pregunta d vuelta !!!
saludos!! :hola:
PD: usas eclipse ?? o en bloc de notas ???
kas09013:
gracias si entendii ahorita voi a tratar de componerlo ojala q si me salga :)
pD. uso bloc de notas :)
kas09013:
u.U! ya no me sale el error se exception in thread main java.lang.stackover, pero ahora se me cicla, me imprime el arreglo ordenado demasiadas veces! u.u le cambie el if por un if con else y no, lo cambie por un while, y no por un do while y tampoco! :/ tienen idea de que es lo que hace mal?, u.u mi codigo quedo asi;
import java.io.*;//Libreria De Java Para Ingresar Datos Desde Teclado
class SeleccionRecursivo{// Nombre de La Clase
public static int Seleccion(int numeros[], int k){
int aux, i=0, l,posMayor=0;
do{
for(i=1; i<k;i++){
if(numeros>numeros[posMayor]){
posMayor=i;
}
aux=numeros[k-1];
numeros[k-1]=numeros[posMayor];
numeros[posMayor]=aux;
}
System.out.println(" ");
for (l=0; l<k; l++){// For Para Imprimir La Ordenacion De Los Numeros
System.out.print("|");
System.out.print(numeros[l] + "|");
}
}while(k>1);
return Seleccion(numeros, k-1);
}
public static void main(String args[])throws IOException{
BufferedReader res1=new BufferedReader(new InputStreamReader(System.in));
long tiempoInicio = System.currentTimeMillis();
int n;
int v[]=new int [15];//Declaracion De Arreglo
int res;// Declaracion De Variable
System.out.println ( "n||************** Metodo De Odenacion Seleccion **************|| n|| || ");
System.out.println ( "|| 1.-Cantidad De Numeros A Ordenar: ||");
System.out.print( "|| ");
n=Integer.parseInt(res1.readLine());//Lee Los Datos Introducidos Desde Teclado
System.out.println ( "|| 2.-Numeros A Ordenar: ||");
for (int i=0; i<n; i++){// Ciclo For Para Pedir que Indroduzca Los Valores
System.out.print( "|| ");
v=Integer.parseInt(res1.readLine());}// Lee y Almacena Los Datos Desde teclado En El Arreglo
System.out.println("|| 3.-Ordenacion De Numeros || n");
for (int i=0; i<n; i++){//Ciclo For Para La Ordenacion de Numeros
System.out.print("|");
System.out.print(v + "|");
}
System.out.println(" ");
res=Seleccion(v,n);//Llama All Metodo anterior Para Que Devuelva Datos
long totalTiempo = System.currentTimeMillis() - tiempoInicio;// Funcion Que Mide El Tiempo Y Calcula El Tiempo Total Empleado A Partir De La Diferencia Del Tiempo Inicial Y Final
System.out.println("n||El tiempo total de la ejecucion es :" + totalTiempo + " miliseg");
System.out.println ( "n||**********************************************************||");
}
}
tomas_sauron:
Hola este es tu mismo codigo pero con un else de mas y anda bien
--- Código: Java ---import java.io.*;//Libreria De Java Para Ingresar Datos Desde Teclado class SeleccionRecursivo{// Nombre de La Clase public static int Seleccion(int numeros[], int n){ int aux, i, l, posMayor; int ulpos=n; if(n>1){ posMayor=0; for(i=1; i<n;i++){ if(numeros[i]>numeros[posMayor]){ posMayor=i; } aux=numeros[n-1]; numeros[n-1]=numeros[posMayor]; numeros[posMayor]=aux; } System.out.println(" "); for (l=0; l<10; l++){// For Para Imprimir La Ordenacion De Los Numeros System.out.print("|"); System.out.print(numeros[l] + "|"); } return Seleccion(numeros, n-1); } else{ return 0; //este es el else añadido } } public static void main(String args[])throws IOException{ BufferedReader res1=new BufferedReader(new InputStreamReader(System.in)); long tiempoInicio = System.currentTimeMillis(); int n; int v[]=new int [15];//Declaracion De Arreglo int res;// Declaracion De Variable System.out.println ( "n||************** Metodo De Odenacion Seleccion **************|| n|| || "); System.out.println ( "|| 1.-Cantidad De Numeros A Ordenar: ||"); System.out.print( "|| "); n=Integer.parseInt(res1.readLine());//Lee Los Datos Introducidos Desde Teclado System.out.println ( "|| 2.-Numeros A Ordenar: ||"); for (int i=0; i<n; i++){// Ciclo For Para Pedir que Indroduzca Los Valores System.out.print( "|| "); v[i]=Integer.parseInt(res1.readLine());}// Lee y Almacena Los Datos Desde teclado En El Arreglo System.out.println("|| 3.-Ordenacion De Numeros || n"); for (int i=0; i<n; i++){//Ciclo For Para La Ordenacion de Numeros System.out.print("|"); System.out.print(v[i] + "|"); } System.out.println(" "); res=Seleccion(v,n);//Llama All Metodo anterior Para Que Devuelva Datos long totalTiempo = System.currentTimeMillis() - tiempoInicio;// Funcion Que Mide El Tiempo Y Calcula El //Tiempo Total Empleado A Partir De La Diferencia Del Tiempo Inicial Y Final System.out.println("n||El tiempo total de la ejecucion es :" + totalTiempo + " miliseg"); System.out.println ( "n||**********************************************************||"); } } fijate si anda asi
...
osea t lo imprime por cada llamada recursiva xq lo hicist asi
a eso t referis q t lo imprime repetidas vcs ???? si es asi pods hacr 1 metodo q sea d ordenamiento q reciba el arreglo y t lo dvuelva ordenado
y lo mostras en el main o t acs otro metodo q lo muestre si tnes dudas consulta d vuelta !!
saludos !!
Navegación
[#] Página Siguiente
Ir a la versión completa