Programación General > Java

 error Exception in thread "main" java.lang.StackOver

(1/3) > >>

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

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa