SoloCodigo

Programación General => Java => Mensaje iniciado por: kas09013 en Domingo 22 de Mayo de 2011, 04:17

Título: error Exception in thread "main" java.lang.StackOver
Publicado por: kas09013 en Domingo 22 de Mayo de 2011, 04:17
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||**********************************************************||");
     
      }    
}
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: tomas_sauron en Lunes 23 de Mayo de 2011, 03:17
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 ???
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: kas09013 en Lunes 23 de Mayo de 2011, 06:06
gracias si entendii ahorita voi a tratar de componerlo ojala q si me salga   :)
pD. uso bloc de notas :)
Título: metodo sin fin
Publicado por: kas09013 en Lunes 23 de Mayo de 2011, 06:34
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||**********************************************************||");
     
      }    
}
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: tomas_sauron en Lunes 23 de Mayo de 2011, 23:48
Hola este es tu mismo codigo pero con un else de mas y anda bien

Código: Java
  1. import java.io.*;//Libreria De Java Para Ingresar Datos Desde Teclado
  2.     class SeleccionRecursivo{// Nombre de La Clase
  3.     public static int Seleccion(int numeros[], int n){
  4.     int aux, i, l, posMayor;
  5.     int ulpos=n;
  6.     if(n>1){
  7.      posMayor=0;
  8.      for(i=1; i<n;i++){
  9.      if(numeros[i]>numeros[posMayor]){
  10.      posMayor=i;
  11.      }
  12.      aux=numeros[n-1];
  13.      numeros[n-1]=numeros[posMayor];
  14.      numeros[posMayor]=aux;
  15.      }
  16.      
  17.      
  18.     System.out.println(" ");
  19.      for (l=0; l<10; l++){// For Para Imprimir La Ordenacion De Los Numeros
  20.      System.out.print("|");
  21.      System.out.print(numeros[l] + "|");
  22.      }
  23.      return Seleccion(numeros, n-1);
  24.     }
  25.    else{
  26.        
  27.        
  28.             return 0;                  //este es el else añadido
  29.        
  30.        
  31.          
  32.     }
  33.        
  34.      
  35.  
  36.     }
  37.  
  38.     public static void main(String args[])throws IOException{
  39.     long tiempoInicio = System.currentTimeMillis();
  40.     int n;
  41.      int v[]=new int [15];//Declaracion De Arreglo
  42.      int res;// Declaracion De Variable
  43.      System.out.println ( "n||************** Metodo De Odenacion Seleccion **************|| n|| || ");
  44.      System.out.println ( "|| 1.-Cantidad De Numeros A Ordenar: ||");
  45.      System.out.print( "|| ");
  46.      n=Integer.parseInt(res1.readLine());//Lee Los Datos Introducidos Desde Teclado
  47.     System.out.println ( "|| 2.-Numeros A Ordenar: ||");
  48.      for (int i=0; i<n; i++){// Ciclo For Para Pedir que Indroduzca Los Valores
  49.     System.out.print( "|| ");
  50.      v[i]=Integer.parseInt(res1.readLine());}// Lee y Almacena Los Datos Desde teclado En El Arreglo
  51.      System.out.println("|| 3.-Ordenacion De Numeros || n");
  52.      for (int i=0; i<n; i++){//Ciclo For Para La Ordenacion de Numeros
  53.      System.out.print("|");
  54.      System.out.print(v[i] + "|");
  55.      }
  56.      System.out.println(" ");
  57.      res=Seleccion(v,n);//Llama All Metodo anterior Para Que Devuelva Datos
  58.      long totalTiempo = System.currentTimeMillis() - tiempoInicio;// Funcion Que Mide El Tiempo Y Calcula El
  59.  
  60.      //Tiempo Total Empleado A Partir De La Diferencia Del Tiempo Inicial Y Final
  61.      System.out.println("n||El tiempo total de la ejecucion es :" + totalTiempo + " miliseg");
  62.      System.out.println ( "n||**********************************************************||");
  63.  
  64.      }
  65.    
  66.  
  67. }
  68.  
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 !!
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: tomas_sauron en Martes 24 de Mayo de 2011, 00:33
ahhhhhhhhhhhhhhhhh ya entndi !!! noc xq le pusist un bucle ??? recursividad es anti bucle !! por asi dcirlo  <_<
o sea si usas recursividad no pods usar bucles ya sean for while do while xq lo q ac la recursividad s repetir varias vcs una llamada a una funcion (metodo ) hasta q una condicion d cort se cumpla y salga con 1 resultado
x ejemplo
 
Código: Java
  1. if (n==0){
  2.                         n=1;
  3.                         return n;
  4.                    }
  5.                      else{
  6.                              return  factorial(n-1)*n
  7.  
  aca factorial c llama el metodo
y se llama asi mismo restandole al argumento n una unidad (o sea n-1)y lo hace
hasta q n valga cero cuando n vale cero sale con un uno devuelve el resultado d acr 1*factorial(2)*factorial(3)*factorial(4) por eso
q no ac falta un while sino  esta d mas por eso cicla infinitamente
espero t sirva sino ya sabs pregunta d vuelta !!  [/color]
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: kas09013 en Martes 24 de Mayo de 2011, 20:02
Muchas garcias! :) si ya ahora si corre bien , pero que cres! no hace lo que quiero creo que lo no hice bien por que no los acomoda como el ordenamiento de seleccion! o.O lo ordena como inserccion !u.U ya me estresee u.u empezzare de nuevo a crearlo si tienes un ejemplo de seleccion recursivo te lo agradeceria muucho. Sino de todas formas muchisiimas gracias :)
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: kas09013 en Martes 24 de Mayo de 2011, 20:46
ya lo hicee! :) pero no me los ordena bien alguna idea?
 import java.io.*;//Libreria De Java Para Ingresar Datos Desde Teclado
class SeleccionRecursivo2{// Nombre de La Clase
public static int Seleccion(int v[], int n){
int i, minimo,l;
   if (n>=1) {
      minimo=0;
   for(i=1;i<n;i++)
      if(v<v[minimo])
      minimo=i;
      i=v[0];
      v[0]=v[minimo];
      v[minimo]=i;
   
   
   return   Seleccion(v,n-1);
   }else{
   return 0;
}
}
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||**********************************************************||");
     
      }    
} //fin clase seleccion recursivo
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: kas09013 en Martes 24 de Mayo de 2011, 22:51
esto de recursividad no me sale, lo eh vuelto a cambiar por que no hacia bien los cambios si lo acomodaba pero no por orden de seleccion eh cambiado el codigo pero solo me  imprime el primer cambio alguna sugerencia?
Código: Java
  1.   import java.io.*;//Libreria De Java Para Ingresar Datos Desde Teclado
  2. class SeleccionRecursivo5{// Nombre de La Clase
  3. public static int Seleccion(int v[], int n, int m){
  4. int i=0, j, min, k, l;
  5.      int cambio;
  6.      if (m<n) {
  7.  min=v[i];// Asignacion Del Valor En La Variable Min En El Arreglo a[i]
  8.              k=0;// Asignacion De 0 A La Variable k
  9.              cambio=0;//Asignacion de 0 A La Variable cambio
  10.          for(j=m+1; j<n; j++)//For Para Seguir Ordenando Numeros
  11.            if(v[j]<min)//If Que Compara Valor Del Arreglo a[j] Con min
  12.              min=v[j];//Asignacion Del Valor De La Variable min En El Arreglo a[j]
  13.              k=j;//Asigna Valor De k En j
  14.              cambio=1;//A Cambio Le Asigna El valor De 1
  15.              
  16.            
  17.           if(cambio==1){// Comparacion Del Valor de Cambio
  18.             v[k]=v[i];// Asignacion Del Valor Del arrreglo a[k] en a[i]
  19.             v[i]=min;// Asignacion Del Valor Del Arreglo a[i] En La Variable Min
  20.             System.out.println(" ");
  21.               for (l=0; l<n; l++){// For Para Imprimir La Ordenacion De Los Numeros
  22.               System.out.print("|");
  23.               System.out.print(v[l] + "|");
  24.              }
  25.            }
  26.            
  27. return  Seleccion(v,n,m+1);
  28. }else{
  29. return 0;
  30. }
  31. }
  32. public static void main(String args[])throws IOException{
  33. long tiempoInicio = System.currentTimeMillis();
  34.     int n,m=0;
  35.     int v[]=new int [15];//Declaracion De Arreglo
  36.     int res;// Declaracion De Variable
  37.         System.out.println ( "n||************** Metodo De Odenacion Seleccion **************|| n||                                                         || ");
  38.        System.out.println ( "||   1.-Cantidad De Numeros A Ordenar:            ||");
  39.        System.out.print( "||      ");
  40.         n=Integer.parseInt(res1.readLine());//Lee Los Datos Introducidos Desde Teclado
  41.        System.out.println ( "||   2.-Numeros A Ordenar:                    ||");
  42.             for (int i=0; i<n; i++){// Ciclo For Para Pedir que Indroduzca Los Valores
  43.                 System.out.print( "||      ");
  44.                 v[i]=Integer.parseInt(res1.readLine());}// Lee y Almacena Los Datos Desde teclado En El Arreglo
  45.                 System.out.println("||   3.-Ordenacion De Numeros                  ||  n");
  46.                      for (int i=0; i<n; i++){//Ciclo For Para La Ordenacion de Numeros
  47.                         System.out.print("|");
  48.                         System.out.print(v[i] + "|");
  49.                         }
  50.        System.out.println(" ");
  51.        res=Seleccion(v,n,m);//Llama All Metodo anterior Para Que Devuelva Datos
  52.        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
  53.        System.out.println("n||El tiempo total de la ejecucion es :" + totalTiempo + " miliseg");
  54.        System.out.println ( "n||**********************************************************||");
  55.      
  56.       }    
  57. } //f
  58.  
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: kas09013 en Martes 24 de Mayo de 2011, 23:08
:) gracias por tu ayudaa ya pude terminarlo :)
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: tomas_sauron en Miércoles 25 de Mayo de 2011, 06:08
Ak lo tngo m costo 1 toke xq hacia mucho no hacia metodos d ordenamiento jajaja
espero t sirva



Código: Java
  1. import java.io.*;
  2.  
  3. class SeleccionRecursivo{
  4.    
  5.    
  6.    
  7.      
  8.     public void selSort1(int[] vector,int ini,int ult){
  9.        
  10.            int aux;
  11.          if(ini<ult){  
  12.            if(vector[ini]>vector[ult]){
  13.                aux=vector[ult];
  14.                vector[ult]=vector[ini];
  15.                vector[ini]=aux;
  16.                selSort1(vector,ini,ult-1);  
  17.                
  18.            }
  19.             else{
  20.                 selSort1(vector,ini,ult-1);
  21.                
  22.             }
  23.          }
  24.        
  25.     }
  26.  
  27.       public void selSort(int[]vector,int ini,int ult){
  28.          
  29.           if(ini<ult){
  30.               selSort1(vector,ini,ult);
  31.               selSort(vector, ini+1, ult);
  32.              
  33.           }
  34.       }
  35.      
  36. }   
  37.  
  38. //-------------------------main----------------
  39. import java.io.*;
  40.     class SeleccionRecursivo2{
  41.    
  42.    
  43.     public static void main(String args[])throws IOException{
  44.        
  45.      SeleccionRecursivo  selSort=new SeleccionRecursivo();
  46.      long tiempoInicio = System.currentTimeMillis();
  47.      int n;
  48.      int v[]=new int [15];//Declaracion De Arreglo
  49.      int res;// Declaracion De Variable
  50.      System.out.println ( "n||************** Metodo De Odenacion Seleccion **************|| n|| || ");
  51.      System.out.println ( "|| 1.-Cantidad De Numeros A Ordenar: ||");
  52.      System.out.print( "|| ");
  53.      n=Integer.parseInt(res1.readLine());//Lee Los Datos Introducidos Desde Teclado
  54.      System.out.println ( "|| 2.-Numeros A Ordenar: ||");
  55.      for (int i=0; i<n; i++){// Ciclo For Para Pedir que Indroduzca Los Valores
  56.      System.out.print( "|| ");
  57.      v[i]=Integer.parseInt(res1.readLine());
  58.      }                                                         // Lee y Almacena Los Datos Desde teclado En El Arreglo
  59.      
  60.      selSort.selSort(v, 0, n-1);
  61.      System.out.println("|| 3.-Ordenacion De Numeros || n");
  62.      
  63.      for (int i=0; i<n; i++){//Ciclo For Para La Ordenacion de Numeros
  64.      System.out.print("|");
  65.      System.out.print(v[i] + "|");
  66.      }
  67.      System.out.println(" ");
  68.    
  69.      }
  70.     }
  71.  


Saludos!! :good:
PD:es totalmente recursivo
no utiliza bucles for while o do while
  [/color]
Título: Re: error Exception in thread "main" java.lang.StackOver
Publicado por: kas09013 en Jueves 26 de Mayo de 2011, 05:42
Muchisimas gracias!!! mee az salvadoo :) gracias!!!!!!!!