lunes, 11 de noviembre de 2013

FUNCIONES RECURSIVAS EN JAVA




1.    Escriba una función recursiva que imprima en forma invertida los dígitos de un número entero.

      SOLUCIÓN:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ejer1 {

    public static void invertir(int num){
        System.out.print(num%10);
        if(num/10!=0){
             invertir(num/10);
         }
     }

    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int n;
        System.out.println("Ingrese el numero a evaluar: ");
        n=Integer.parseInt(br.readLine());

        System.out.print("El numero invertido es: ");
        invertir(n);
        System.out.println();
    }
}


2.    Escriba una función recursiva que invierta una cadena de caracteres.
      
     SOLUCIÓN:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ejer4 {
    public static String invertir(String cad, int tama){
        String c2="";        
        if(tama==0){
            c2+=cad.charAt(tama);
            return c2;
        }
        else{
            c2=cad.charAt(tama)+invertir(cad, tama-1);
            return c2;
        }       
    }

    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int tamaño;
        String cadena;
        System.out.println("Ingrese la cadena a evaluar: ");
        cadena=br.readLine();
        tamaño=cadena.length()-1;

        System.out.println("La nueva cadena es: "+invertir(cadena, tamaño));       
    }
}


3.   Diseñe una función recursiva exponente tal que dada la base y el exponente como números enteros devuelva su resultado. Validar que la base será mayor que cero y el exponente mayor o igual que cero.

      SOLUCIÓN:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ejer5 {
    public static int exponente(int base, int exp){
        if(exp==0){
            return 1;
        }
        else{
            return base*exponente(base,exp-1);
        }
    }

    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        int n, b;
        do{
            System.out.println("Ingrese el numero: ");
            n=Integer.parseInt(br.readLine());
        }while(n<=0);

        do{
            System.out.println("Ingrese la base: ");
            b=Integer.parseInt(br.readLine());
        }while(b<0);
        System.out.println("El resultado es: "+exponente(n, b));
    }
}


4.  Programar un algoritmo recursivo que permita sumar los elementos de un vector.
      
      SOLUCIÓN:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ejer6 {
    public static int vector(int A[], int num){       
        if(num==0){
           return A[num];
        }
        else{
            return A[num]+vector(A,num-1);
        }       
    }

    public static void main(String[] args) throws IOException{

        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        int V[], n;
        System.out.println("Ingrese el tamaño: ");
        n=Integer.parseInt(br.readLine());
        V=new int[n];
       
        for(int i=0;i<n;i++){
            System.out.println("V ["+i+"] = ");
            V[i]=Integer.parseInt(br.readLine());
        }
         System.out.println("La suma de los elementos es: "+vector(V,n-1));
    }
}


5.   Escribir una función recursiva que tenga un argumento de tipo entero y que devuelva la letra P si el número es positivo y la letra N si el número es cero o negativo.

      SOLUCIÓN:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ejer8 {

    public static char valor(int numero){
        if(numero<=0){
            return 'N';
        }
        else{
            return 'P';
        }
    }

    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        int n;
        char v;
        System.out.println("Igrese el numero: ");
        n=Integer.parseInt(br.readLine());

        v=valor(n);
        if(v=='P'){
            System.out.println("El numero es positivo");
        }
        else{
            System.out.println("El numero es negativo");
        }
    }
}


6.  Escriba una función recursiva que sume los (n) primeros números enteros positivos.

     SOLUCIÓN:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Ejer3 {
    public static int sumar(int a){
        if(a>0){
            return a+sumar(a-1);
        }
        else{
            return 0;
        }
    }

    public static void main(String[] args) throws IOException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));

        int n;
        System.out.println("INgrese la cantidad de numeros a sumar: ");
        n=Integer.parseInt(br.readLine());
        System.out.println("La suma es: "+sumar(n));
    }
}


7.    Escriba una función recursiva muestre la SERIE DE FIBONACCI, ingresando el número de términos.

     SOLUCIÓN:

import java.util.Scanner;

public class Ejer9 {
    public static int fibonaci(int numero){
        if(numero==0||numero==1){
            return 1;
        }
        else{
            return fibonaci(numero-1)+fibonaci(numero-2);
        }
    }

    public static void main(String[] args) {
        Scanner b=new Scanner(System.in);

        int n, i;
        System.out.println("Ingrese la cantidad de terminos: ");
        n=b.nextInt();
        for(i=0;i<n;i++){
            System.out.print(fibonaci(i)+" ");
        }
        System.out.println("");       
    }
}

16 comentarios:

  1. Halle el valor de la sumatoria de los números de 2 hasta 8.

    EL programa debe imprimir únicamente el valor final, en este caso si se ingresa 2 como valor inicial y 8 como valor final el programa debe mostrar 35;

    2 + 3 +4 +5 +6 +7 +8 = 35

    ResponderEliminar
    Respuestas
    1. Una solución:

      public class Recursividad {

      public static void main(String[] args) {
      int x=2;
      int y = 8;
      int sum = sumatorioXaY(x,y);
      System.out.println("Sumatorio:" + sumatorioXaY(x,y)) ;
      }

      public static int sumatorioXaY(int x,int y){
      if (y<x) { return sumatorioXaY(y,x);}
      if(x == y) { return y;}
      return x + sumatorioXaY(++x,y);

      }
      }

      Eliminar
  2. Programe un método recursivo que calcule la suma de un arreglo de números enteros.

    ResponderEliminar
    Respuestas
    1. Una posible solución es:
      public class Recursividad {

      public static void main(String[] args) {
      int[]v = {1,2,3,4,5};
      System.out.println("Suma componentes de " + toString(v) + ": " + sumaComponentesVector(v));
      }

      private static String toStringRec(int[]v,int pos){
      if (pos==v.length-1){ return Integer.toString(v[pos]) + "]"; }
      else if(pos==0){ return "[" + Integer.toString(v[pos]) + ", "+ toStringRec(v,++pos);}
      return Integer.toString(v[pos]) + ", " + toStringRec(v,++pos);
      }

      public static String toString(int[]v){
      return toStringRec(v,0);
      }

      private static int sumaVecRec(int[]v,int pos){
      if(pos == 1){ return v[0];}
      return v[pos-1] + sumaVecRec(v,--pos);
      }

      public static int sumaComponentesVector(int[]v){
      return sumaVecRec(v,v.length);
      }
      }

      Eliminar
  3. ayudaaa!! es que es un trabajo es una imagen una clase en uml no se como poder ma ndarlo para qe me ayuden

    EMPLEADO
    -rut:String
    -nombre:string
    -ap_paterno:String
    -jefe:EMPLEADO

    +EMPLEADO()
    +obtenerDatosEmpleados():String


    es un ejercicio de recursividad qe esta de 1..* a 1

    ResponderEliminar
  4. Tu ejercicio recursivo para invertir números es un éxito, gracias!

    ResponderEliminar
  5. ayuda
    se recibe un n umero entero de 2 cifras o mas y debe invertir el primer y el ultimo dígito

    ResponderEliminar
    Respuestas
    1. Una posible solución imprimiendo podría ser:

      public class Recursividad {

      public static void main(String[] args) {

      invertirFirstAndLast(123456789);
      }


      private static void invierteRec(String num,int pos,int length){
      if(pos == length){
      System.out.print(num.charAt(0));
      }
      else if(pos == 0){
      System.out.print(num.charAt(length));
      invierteRec(num,++pos,length);
      }
      else{
      System.out.print(num.charAt(pos));
      invierteRec(num,++pos,length);
      }

      }

      public static void invertirFirstAndLast(int num){
      if(num<10){ System.out.println("Entrada incorrecta");}
      else{
      invierteRec(Integer.toString(num),0,Integer.toString(num).length()-1);

      }
      }

      }

      Eliminar
  6. Hola, el post esta ree bueno solo una consulta, disculpando la ignorancia. ¿Porque pusiste en el ejercicio 1 que System.out.print(num%10);
    if(num/10!=0){
    invertir(num/10);
    Es decir por que haces el resuido de la division entre 10?

    ResponderEliminar
    Respuestas
    1. Buenos días, porque el residuo de una división entre 10 es un solo dígito, es decir es un número de 0 a 9, sin embargo el resultado de la división no tiene porque ser un solo número. Te lo explico mejor con un ejemplo:
      Si num = 1234 e hiciese System.out.print(num/10) lo que saldría por consola sería 123.4.
      Si hago System.out.print(num%10) lo que sale por consola es el residuo de la división entera, es decir 1234/10 = 123 + Residuo, donde el residuo es 4 y solo se imprime el 4.
      Teniendo esto en cuenta lo que hace el método es simple:

      invertir(1234) -> llega num= 1234
      imprime el resido num%10 que es 4
      Si el num/10 es distinto de 0 (Solo cuando num sea 0 será 0)
      llamo recursivamente a invertir pasandole num/10 que sera 123 al ser entero, volvera a imprimr num%10 que es 3 y continuara hasta que el num que reciba la funcion sea 0

      Eliminar
  7. El ejercicio 1 sólo imprime el numero en consola si se quisiera devolver ese número como entero para poder imprimirlo u operar con él se complicaría un poco el código:

    Seguro que hay más formas de hacerlo pero os dejo ésta por si os sirve:

    public class Recursividad {

    public static void main(String[] args) {
    System.out.println(invertir(123456789));
    }


    public static int invertir(int num){
    if(num<10){ return num%10; }
    return num%10*((int)Math.pow(10, Integer.toString(num).length()-1)) + invertir(num/10);

    }

    }

    ResponderEliminar
  8. Tengo este ejercicio, aunque parece fácil, no lo es :hay que encontrar un documento que denotemos por la variable X :
    sea V= {2,3,1,6,0,8,5,4}
    buscar (V,X,inicio,fin)
    if ( inicio es mayor fin) { return-1}
    elseif (V[inicio]=X){return inicio}
    else { return buscar (V,X,inicio-1,fin)}

    ahi está un ejercicio que muy pocos han desarrollados, ahi les dejo un desafío.

    ResponderEliminar
  9. public static String invertir(String cadena, int longitud){

    String c2="";
    if(longitud==0){
    c2+=cadena.charAt(longitud);
    return c2;
    }
    else{
    c2=cadena.charAt(longitud)+invertir(cadena, longitud-1);
    return c2;
    }
    }

    que quiere decir esas lineas de codigo?

    ResponderEliminar
  10. ayuda...
    rear una aplicación recursiva, donde proporcionando 3 valores enteros,
    se disminuya en 6 unidades cada valor hasta llegar lo mas cerca a 0, al finalizar mostrar los valores minimos
    Ejemplo a mostrar:
    Valor1 Valor2 Valor 3
    60 20 30
    54 14 24
    48 8 18
    42 2 12
    36 2 6
    30 2 0
    24 2 0
    18 2 0
    12 2 0
    6 2 0
    0 2 0
    Valores mínimos a mostrar:
    Valor1 valor2 valor3
    60 mínimo 0 20 mínimo 2 30 mínimo 0

    ResponderEliminar
  11. (Imprimir los dígitos en un número entero a la inversa) Escriba un método recursivo que
    muestre un valor int de forma inversa en la consola usando el siguiente encabezado:
    public static void invertir (valor int)
    Por ejemplo,
    invertir (12345) muestra 54321.

    ResponderEliminar