Foros aprenderaprogramar.com

Aprender a programar => C, C++, C#, Java, Visual Basic, HTML, PHP, CSS, Javascript, Ajax, Joomla, MySql y más => Mensaje iniciado por: Mac en 23 de Agosto 2014, 05:33

Título: Recursividad Para Un Vector (Java) recorrer array recursivo
Publicado por: Mac en 23 de Agosto 2014, 05:33
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 
----------------------------------------------------------------------------
Título: Re:Recursividad Para Un Vector (Java)
Publicado por: Mastermind 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
Título: Re:Recursividad Para Un Vector (Java)
Publicado por: Mac 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 ?¿ > :-\ :-\
Título: Re:Recursividad Para Un Vector (Java)
Publicado por: Mastermind 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
Título: Re:Recursividad Para Un Vector (Java)
Publicado por: Mac 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 !
Título: Re:Recursividad Para Un Vector (Java)
Publicado por: Mastermind 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);}

    }   
}
Título: Re:Recursividad Para Un Vector (Java)
Publicado por: Mac en 24 de Agosto 2014, 18:06
Gracias Mastermind

Sera que me puedes ayudar con esta
---------------------------------------------------------------
- Búsqueda Binaria..
---------------------------------------------------------------
Título: Re:Recursividad Para Un Vector (Java)
Publicado por: Mastermind 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á.
Título: Re:Recursividad Para Un Vector (Java)
Publicado por: Mac en 27 de Agosto 2014, 05:02
Muchísimas Gracias !!! Solucionado !!   :D :D :D :D