Recurisividad Java


Bueno el dia de hoy tengo que hacer unos cuantos ejercicios de Recursividad asi que pues comenzare. 

El enunciado dice asi:

Elaborar un método recursivo que devuelva la cantidad de números pares e impares contenidos en un número entero positivo enviado como parámetro. Por ejemplo: suponga que el método recibe el número: 7865429 El resultado debe ser: Hay 4 números pares y 3 números impares.

Explicación:
A simple vista se ve facil, se espera que el usuario dijite el numero y se guarda en una variable de tipo string, pero por que String, es importante ya que asi podre recorrer los "números" indice por indice, aca lo complicado es en si eso ya que no se puede utilizar ciclos, entonces cada vez que voy recorriendo la posición del string con el método substring me toca convertir ese carácter en un numero entero (Hacer un parseo). Cuando ya tenga ese carácter como entero simplemente con un if reviso si el residuo (%) es eso, si es asi pues el carácter es un numero entero y le sumo uno a una variable que tenga de contador de entero, si no es asi aumento en uno una variable que tenga como conteo de impares.



import java.util.Scanner;;
public class Contador_imp_pares {

 public static void main(String[] args) {
  
  Scanner leer = new Scanner(System.in);
  System.out.print("Ingrese el Numero para contar: ");
  String numero = leer.next();
  
  try{
   int []  resultado = contador(0,0,numero);
   System.out.println();
   System.out.println("Total Pares "+ resultado[0]);
   System.out.println("Total ImPares "+ resultado[1]);
  }catch (Exception e){
   System.out.println("Algun numero no es impar, lo siento :(");
   System.exit(0);
  } 

 }
 
 
 private static int[] contador(int pares, int impares, String numero){
  int tamaño = numero.length();
  if(tamaño ==1){
   int numero_tmp_char = Integer.parseInt(numero);
   if(numero_tmp_char%2 ==0){
    int[] conteo = new int[2];
    conteo[0]= pares+1;
    conteo[1]= impares;
    return conteo;        
   }else{
    int[] conteo = new int[2];
    conteo[0]= pares;
    conteo[1]= impares+1;
    return conteo; 
   }
    
  }else{
   int char_int_temp = Integer.parseInt(numero.substring(tamaño-1));
   if(char_int_temp %2==0){
    return contador(pares+1, impares, numero.substring(0, tamaño-1));
   }else{
    return contador(pares, impares+1, numero.substring(0, tamaño-1));
   }
  }
  
  
 }

}




En el seguimiento ejercicio Me están pidiendo que haga un algoritmo recursivo donde el usuario ingrese un numero y un exponente, el numero deberá ser positivo ya que si es negativo se convertirá en un ciclo infinito.


Explicación:

Antes que ir al codigo, es necesario saber que la base nunca va a cambiar en el algoritmo y lo que va a cambiar es el valor del exponente.
Es decir el exponente ira disminuyendo en uno cada vez que se llame asi mismo hasta llegar a uno, cuando el exponente llegue a uno hay termina de hacerse la recursion y debe retornar la misma base, de esa forma comenzara a escalar el valor hasta que llegue al valor correcto.



import java.util.Scanner;
public class NumeroPencia {

 public static void main(String[] args) {
  
 Scanner leer = new Scanner(System.in);
 Boolean menu=true;
 int base=0, expo=0;
 
 
  try{  
  
   System.out.print("Ingrese Base Entera Positiva");
   base = leer.nextInt();
   
   System.out.println();
   System.out.print("Ingrese exponente Entero Positiva");
   
   
   expo = leer.nextInt();
   if(base <0 || expo <0){
    //Forzamos el eception para que se repita el cliclo
    //Basado de http://stackoverflow.com/questions/576266/can-i-force-java-to-throw-an-error-when-dividing-by-zero-with-floating-point-num
    throw new Exception();
   }
   System.out.println("El mejor Resultado: "+ potencia(expo, base) );
  }catch (Exception e) {
   System.out.println("Deverias saber que es entero Positivo, lo siento Bay :(");
  }   
 } 
 
 //Se pensaba retornar como double para que calculara cualquier operacion
 //Pero entonce si se hace 3^2 seria 9.0 y no 9 como dice el enunciado???
 private static int potencia(int exponente, int base){
  int total;
  if(exponente == 0){
   total = 1; 
  }else{
   total = base*potencia(exponente-1, base);
  } 
  
  return total;
 }

}

El ultimo enunciado me dicen que haga un algoritmo donde el usuario ingrese una palabra y se devuelva toda la palabra ingresada de forma contraria o alrevez, por ejemplo si se ingresa hola debe retorna aloh.

Explicacion:

Este mas sencillo, lo primero que hay que saber es que el string que ingresa el usuario se puede subdividir con la función substring, ahora simplemente toca es analizar como se recorre el string y se va concatenando a una nueva variable que es la que se va a retornar.




import java.util.Scanner;
public class Palabra_invertida {

 public static void main(String[] args) {
  Scanner leer = new Scanner(System.in);
  String palabra="";
  
  System.out.println("Solo Se leera una palabra si Ingresa Dos o mas no sera tomadas en cuenta");
  System.out.println("Ingrese la Palabra para inveritr:");
  //Con el next aplico lo del primer enunciado
  palabra = leer.next();   
  System.out.println();
  System.out.println();
  System.out.println();
  System.out.println("<<<<<<<Palabra Seleccionada: "+palabra+">>>>>>>");
  if (palabra.length()>10){
   System.out.println("Palabra muy larga, lo siento :(");
  }else{
   System.out.println("Palabra Invertida: "+ invertida(palabra));
   
  }
  
  
 } 
 
 
 private static String invertida(String palabra){
  String palabra_inv = palabra;
  int longitud = palabra_inv.length();
  if(longitud==1){
   return palabra_inv;
  }else{
   return palabra_inv.substring(longitud-1) + invertida(palabra_inv.substring(0, longitud-1));
  }
  
  
  
  
 }

}

0 Comentarios