Autor Tema: Recursividad Para Un Vector (Java) recorrer array recursivo  (Leído 54324 veces)

Mac

  • Intermedio
  • ***
  • Mensajes: 174
  • Java-Php
    • Ver Perfil
Alguien que me pueda echar la mano con este ejercicio en Java entorno Netbeans

Tengo que hacer métodos recursivos para leer un vector aleatoriamente, imprimirlo y buscar un elemento.
 
luego Con el Vector Creado

- Imprimir inversamente el vector.
 -Sumar todos los datos posiciones impares.
 -Búsqueda Binaria.

Muchísimas gracias por la orientación a la solución 
----------------------------------------------------------------------------
« Última modificación: 13 de Septiembre 2014, 18:46 por Alex Rodríguez »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:Recursividad Para Un Vector (Java)
« Respuesta #1 en: 23 de Agosto 2014, 22:59 »
Ejemplo para recorrer un vector recursivamente:

Clase VectorTest:

Código: [Seleccionar]
public class VectorTest {

    private int[] vector;
    public VectorTest(int[] v) {
        vector = v;
    }

    public void leerVector(int pos){
        if (pos == vector.length-1) { System.out.println("Elemento en posición "+pos + " es "+vector[pos]);}
        else {
            System.out.println("Elemento en posición "+pos + " es "+vector[pos]);
            leerVector(pos+1);
        }
    }
}

Clase Test (con main):

Código: [Seleccionar]
public class Test {

    public static void main (String[] Args) {
        int[] a = {2, 3, 8, 1, 9};
        VectorTest miVector = new VectorTest(a);
        miVector.leerVector(0);
    }
}

Saludos

Mac

  • Intermedio
  • ***
  • Mensajes: 174
  • Java-Php
    • Ver Perfil
Re:Recursividad Para Un Vector (Java)
« Respuesta #2 en: 24 de Agosto 2014, 01:21 »
Y como podría hacer esto ?¿

leer un vector aleatoriamente, imprimirlo y buscar un elemento.

- Imprimir inversamente el vector.
 -Sumar todos los datos posiciones impares.
 

-Búsqueda Binaria.  --- > Este si que ni lo entiendo ?¿ > :-\ :-\
« Última modificación: 24 de Agosto 2014, 02:01 por Mac »

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:Recursividad Para Un Vector (Java)
« Respuesta #3 en: 24 de Agosto 2014, 12:36 »
Estás manejando conceptos para los que a lo mejor no tienes las bases, es como intentar hacer un pan sin saber amasar la harina.

Para crear un vector de aleatorios (y después leerlos), puedes generar los aleatorios como se indica aquí: http://aprenderaprogramar.com/index.php?option=com_content&view=article&id=638:generar-numeros-aleatorios-en-java-clase-random-y-metodo-nextint-ejercicio-ejemplo-resuelto-cu00672b&catid=68:curso-aprender-programacion-java-desde-cero&Itemid=188

Primero genera la longitud del vector aleatoriamente. Después usa un for para rellenarlo de datos aleatorios. Después ya puedes leerlo con un bucle tradicional o con el método recursivo como el indicado antes.

El concepto de búsqueda binaria lo tienes aquí: http://es.wikipedia.org/wiki/Algoritmo_de_b%C3%BAsqueda

Saludos

Mac

  • Intermedio
  • ***
  • Mensajes: 174
  • Java-Php
    • Ver Perfil
Re:Recursividad Para Un Vector (Java)
« Respuesta #4 en: 24 de Agosto 2014, 16:08 »
Bueno Investigando He logrado hacerlo .. Necesito saber ahora como me puedes ayudar implementando estas dos .. Todo lo he programado recursivamante no puedo utilizar para nada el for ni un  bucle tradicional !!  :)
 
Me faltarían estos dos si puedes ayudarme pues gracia por tu ayuda !!  ;)

Anexare el código !

     Como te digo en el menú me faltaría esto !
-----------------------------------------------------------------------------------------------
   - Sumar todos los datos posiciones impares -
   -  Hacer Búsqueda Binaria -
-------------------------------------------------------------------------------------------------------

Código: [Seleccionar]
package vector;

import java.util.Scanner;

public class VectorPrueba {

    private int[] vector;

    public VectorPrueba(int[] v) {
        vector = v;
    }
    // usuario digita el numero

    public void rellenar_aleatoriamente(int j, int aleatorio, int tamaño) {
        if (aleatorio == 0) {
            if (j <= tamaño - 1) {
                vector[j] = (int) (Math.random() * 10);
            } else {
                System.out.println("vector rellenado aleatoriamente exitosamente");
                aleatorio = 1;
            }

            rellenar_aleatoriamente(j + 1, aleatorio, tamaño);
        }
    }

    public void leerVector(int pos, int tamaño) {

        if (pos == tamaño - 1) {
            System.out.println(" Elemento en posición " + pos + " -- > " + vector[pos]);

        }
        if (pos != tamaño - 1) {

            System.out.println(" Elemento en posición " + pos + " -- > " + vector[pos]);
            leerVector(pos + 1, tamaño);
        }

    }

    public void busqueda_binaria(int i, int encontrado, int usunum, int noencontrado, int tamaño) {

        if (encontrado == 0 && noencontrado == 0) {
            if (usunum == vector[i]) // Para cuando esta !
            {
                System.out.println("el numero  se encuentra en la posicion " + i + " " + "en el vector y es" + " " + vector[i]);
                encontrado = 1;
            } else {
                if (i == tamaño - 1) // Para cuando no esta !
                {
                    System.out.println("numero no esta en  el vector");
                    noencontrado = 1;
                }
            }

            busqueda_binaria(i + 1, encontrado, usunum, noencontrado, tamaño);
        }
    }

    public void imprimir_inversamente(int i, int tamaño, int parar) {
        if (i > 0) {

            if (i != tamaño - 1) {
                if (i > 0) {

                    System.out.println(" Elemento en posición " + i + " -- > " + vector[tamaño - 1]);

                    imprimir_inversamente(i - 1, tamaño - 1, parar);
                }
            }

        }

    }
}
----------------------------------------------------------------------------------------------------------------
Código: [Seleccionar]
package vector;

import java.util.Scanner;

public class LLenarVector {

    public static void main(String[] Args) {

        int encontrado = 0;
        int noencontrado = 0;
        int nummenu;
        int usunum;
        int menu = 0;
        int tam;

        int[] vector = {2, 3, 8, 0, 9, 10, 25, 6};

        VectorPrueba miVector = new VectorPrueba(vector);
        Scanner leer = new Scanner(System.in);
        System.out.println("digite el tamaño del vector  ");
        tam = leer.nextInt();
        while (menu == 0) {

            System.out.println(" -- Digite 1 Para leer y Imprimir  aleatoriamente Vector  --  ");
            System.out.println(" -- Digite 2 Para Buscar un elemento --  ");
            System.out.println(" -- Digite 3 Para Imprimir inversamente el vector --  ");
            System.out.println(" -- Digite 4 Para Sumar todos los datos posiciones impares --  ");
            System.out.println(" -- Digite 5 Búsqueda Binaria --  ");
            System.out.println(" -- Digite 6 Quicksort --  ");
            System.out.println(" -- Digite 7 Para Final  --  ");

            nummenu = leer.nextInt();

            if (nummenu == 1) {

                miVector.rellenar_aleatoriamente(0, 0, tam);
                miVector.leerVector(0, tam);

            }
            if (nummenu == 2) {
                Scanner leerbusca = new Scanner(System.in);
                System.out.println("digite un numero que quieres buscar");
                usunum = leerbusca.nextInt();
                miVector.busqueda_binaria(0, encontrado, usunum, noencontrado, tam);

            }

            if (nummenu == 3) {

                miVector.imprimir_inversamente(tam, tam, 0);
            }

            if (nummenu == 4) {
                // LImpio

            }

            if (nummenu == 5) {
                // LImpio

            }

            if (nummenu == 6) {
                // LImpio

            }

            if (nummenu == 7) // La Verga Cesar
            {
                break;

            }

        }
    }

}


Espero tu ayuda !! Gracias !

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:Recursividad Para Un Vector (Java)
« Respuesta #5 en: 24 de Agosto 2014, 17:06 »
Al intentar imprimir inversamente el vector con tu código se me ha quedado bloqueado el programa. Lo he reescrito, aquí también te incluyo la suma de datos en posiciones impares:

Clase con el main (LlenarVector):

Código: [Seleccionar]
import java.util.Scanner;
public class LLenarVector {
    public static void main(String[] Args) {
        int encontrado = 0;
        int noencontrado = 0;
        int nummenu;
        int usunum;
        int menu = 0;
        int tam;

        int[] vector = {2, 3, 8, 0, 9, 10, 25, 6};

        VectorPrueba miVector = new VectorPrueba(vector);
        Scanner leer = new Scanner(System.in);
        System.out.println("digite el tamaño del vector  ");
        tam = leer.nextInt();
        while (menu == 0) {

            System.out.println(" -- Digite 1 Para leer y Imprimir  aleatoriamente Vector  --  ");
            System.out.println(" -- Digite 2 Para Buscar un elemento --  ");
            System.out.println(" -- Digite 3 Para Imprimir inversamente el vector --  ");
            System.out.println(" -- Digite 4 Para Sumar todos los datos posiciones impares --  ");
            System.out.println(" -- Digite 5 Búsqueda Binaria --  ");
            System.out.println(" -- Digite 6 Quicksort --  ");
            System.out.println(" -- Digite 7 Para Final  --  ");

            nummenu = leer.nextInt();

            if (nummenu == 1) {

                miVector.rellenar_aleatoriamente(tam);
                miVector.leerVector(0, tam);

            }
            if (nummenu == 2) {
                Scanner leerbusca = new Scanner(System.in);
                System.out.println("digite un numero que quieres buscar");
                usunum = leerbusca.nextInt();
                miVector.busqueda_binaria(0, encontrado, usunum, noencontrado, tam);

            }

            if (nummenu == 3) {
                miVector.imprimir_inversamente(tam);
            }

            if (nummenu == 4) {
                System.out.println("La suma de datos en posiciones impares es "+miVector.sumaDatosPosicionesImpares(tam));

            }

            if (nummenu == 5) {
                // LImpio
            }

            if (nummenu == 6) {
                // LImpio
            }

            if (nummenu == 7) // La Verga Cesar
            {
                break;
            }
        }
    }

}

Clase VectorPrueba con algunos cambios y método para suma posiciones impares:

Código: [Seleccionar]
import java.util.Scanner;
public class VectorPrueba {
    private int[] vector;
    public VectorPrueba(int[] v) {
        vector = v;
    }
    // usuario digita el numero

    public void rellenar_aleatoriamente(int contador) {
        if ((contador-1) == 0) {
            vector[0] = (int) (Math.random() * 10);
        } else {
            vector[contador-1] = (int) (Math.random() * 10);
            rellenar_aleatoriamente(contador-1);
        }           
    }

    public void leerVector(int pos, int tamaño) {
        if (pos == tamaño - 1) {
            System.out.println(" Elemento en posición " + pos + " -- > " + vector[pos]);
        }
        if (pos != tamaño - 1) {

            System.out.println(" Elemento en posición " + pos + " -- > " + vector[pos]);
            leerVector(pos + 1, tamaño);
        }

    }

    public void busqueda_binaria(int i, int encontrado, int usunum, int noencontrado, int tamaño) {

        if (encontrado == 0 && noencontrado == 0) {
            if (usunum == vector[i]) // Para cuando esta !
            {
                System.out.println("el numero  se encuentra en la posicion " + i + " " + "en el vector y es" + " " + vector[i]);
                encontrado = 1;
            } else {
                if (i == tamaño - 1) // Para cuando no esta !
                {
                    System.out.println("numero no esta en  el vector");
                    noencontrado = 1;
                }
            }

            busqueda_binaria(i + 1, encontrado, usunum, noencontrado, tamaño);
        }
    }

    public void imprimir_inversamente(int contador) {
        if ((contador-1) > 0) {
            System.out.println(" Elemento en posición " + (contador-1) + " -- > " + vector[contador-1]);
            imprimir_inversamente(contador-1); //Caso recursivo
        }
        else { //Caso base
            System.out.println(" Elemento en posición " + (contador-1) + " -- > " + vector[contador-1]);
        }
    }

    public int sumaDatosPosicionesImpares(int contador){
        if (contador<=1) {return 0;} //Termina la recursión
        if ((contador % 2) == 0){ //Elemento del vector impar
            return (vector[contador-1]+sumaDatosPosicionesImpares(contador-2));
        } else {return sumaDatosPosicionesImpares(contador-1);}

    }   
}

Mac

  • Intermedio
  • ***
  • Mensajes: 174
  • Java-Php
    • Ver Perfil
Re:Recursividad Para Un Vector (Java)
« Respuesta #6 en: 24 de Agosto 2014, 18:06 »
Gracias Mastermind

Sera que me puedes ayudar con esta
---------------------------------------------------------------
- Búsqueda Binaria..
---------------------------------------------------------------

Mastermind

  • Experto
  • *****
  • Mensajes: 536
    • Ver Perfil
Re:Recursividad Para Un Vector (Java)
« Respuesta #7 en: 25 de Agosto 2014, 18:02 »
Básicamente lo tienes explicado en la página de referencia que te puse:

Implementación no recursiva:

Código: [Seleccionar]
int busquedaBinaria(int[]  vector, int n, int dato)
{
   int centro; int inf=0; int sup=n-1;
 
   while(inf<=sup){
     centro=(sup+inf)/2;
     if(vector[centro]==dato) return centro;
     else if(dato < vector [centro] ){
sup=centro-1;
     }
     else {
       inf=centro+1;
     }
   }
   return -1;
}

En este ejemplo se busca el elemento dato dentro del array vector que tiene longitud n. Si se encuentra, se devuelve la posición en que se encuentra. Si no se encuentra, se devuelve -1.

Implementación recursiva:

Código: [Seleccionar]
bool busqueda_dicotomica(int[]  vector, int fin, int x){
     boolean res; int principio =0;
     if(principio <= fin){
         int m = (principio + fin)/2;
         if(x < v[m]) res = busqueda_dicotomica(v, principio, m-1, x);
         else if(x > v[m]) res = busqueda_dicotomica(v, m+1, fin, x);
         else res = true;
     }else res = false;
     return res;
 }

En este caso devuelve true si el elemento x se encuentra dentro del vector, o devuelve false en caso contrario.

Tienes que tener en cuenta que para que la búsqueda binaria funcione, el vector tiene que estar ordenado, es decir, los elementos puestos de menor a mayor. Si no lo ordenas, no funcionará.

Mac

  • Intermedio
  • ***
  • Mensajes: 174
  • Java-Php
    • Ver Perfil
Re:Recursividad Para Un Vector (Java)
« Respuesta #8 en: 27 de Agosto 2014, 05:02 »
Muchísimas Gracias !!! Solucionado !!   :D :D :D :D 

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".