Ejercicios Recursivos en Java y sus Soluciones

Iniciado por :ohk<any>, 11 Octubre 2008, 03:19 AM

0 Miembros y 1 Visitante están viendo este tema.

vhsreturns

Después de bastantes vueltas conseguí el código jajajaja No se como pones esas tablitas tan bonitas que poneis vosotros, pero os lo pego aqui a ver si alguno puede hacerme el favor de ponerlo bien :)

/**
    * subprograma que recoje un número por teclado y lo devuelve invertido en el orden
    * @param num (numero que recojemos por teclado y queremos invertir)
    * @return resultado (numero invertido)
    */
   public static String invertir (int num){
      String resultado = "";
      if (num < 10) //caso base
         resultado = resultado + num;
      else { //caso general
         resultado = invertir (num / 10);
         resultado = ((num % 10)+" , ") + resultado;
      }
      return resultado;
   }

kakimanu

Cita de: Amerikano|Cls en 27 Noviembre 2008, 22:30 PM
Oye una recomendación, el de fibonnaci no es conveniente hacerlo por recursividad, por lo siguiente, y es que las llamadas recursivas se dividen en dos lo cual conlleva a repetir un mismo proceso mas de dos veces y eso le resta velocidad y eficiencia  :xD era solo eso jeje.

salu2

Pero si que es conveniente si lo haces con memoria, esto lo que hará es ahorrar un gran número de operaciones ya que las que ya ha calculado las guarda en un mapa y cuando se necesita se utilizan los resultados guardados:

Código (java) [Seleccionar]

public static int fibonacciMemoria(int n, Map<Integer, Integer> m){

int res = 0;

if(n<=1){
return n;
}else{
int fibon1 = 0;
int fibon2 = 0;
if(m.containsKey(n-1)){
fibon1 = m.get(n-1);
}else{
fibon1 = fibonacciMemoria(n-1,m);
}

if(m.containsKey(n-2)){
fibon2 = m.get(n-2);
}else{
fibon2 = fibonacciMemoria(n-2,m);
}

res = fibon1+fibon2;
m.put(n, res);
}

return res;

}


Y ya si quieres calcular con números mas grandes puedes hacerlo con BigInteger de igual forma:

Código (java) [Seleccionar]
public static BigInteger fibonacciGrande(BigInteger n, Map<BigInteger, BigInteger> m){

BigInteger res = new BigInteger("0");

if(n.compareTo(new BigInteger("1"))<=0){
return n;
}else{
BigInteger fibon1 = new BigInteger("0");
BigInteger fibon2 = new BigInteger("0");
if(m.containsKey(n.subtract(new BigInteger("1")))){
fibon1 = m.get(n.subtract(new BigInteger("1")));
}else{
fibon1 = fibonacciGrande(n.subtract(new BigInteger("1")),m);
}

if(m.containsKey(n.subtract(new BigInteger("2")))){
fibon2 = m.get(n.subtract(new BigInteger("2")));
}else{
fibon2 = fibonacciGrande(n.subtract(new BigInteger("2")),m);
}

res = fibon1.add(fibon2);
m.put(n, res);
}

return res;

}


Un saludo.


DarK_FirefoX

Cita de: kakimanu en 27 Septiembre 2014, 18:30 PM
Pero si que es conveniente si lo haces con memoria, esto lo que hará es ahorrar un gran número de operaciones ya que las que ya ha calculado las guarda en un mapa y cuando se necesita se utilizan los resultados guardados:

Código (java) [Seleccionar]

public static int fibonacciMemoria(int n, Map<Integer, Integer> m){

int res = 0;

if(n<=1){
return n;
}else{
int fibon1 = 0;
int fibon2 = 0;
if(m.containsKey(n-1)){
fibon1 = m.get(n-1);
}else{
fibon1 = fibonacciMemoria(n-1,m);
}

if(m.containsKey(n-2)){
fibon2 = m.get(n-2);
}else{
fibon2 = fibonacciMemoria(n-2,m);
}

res = fibon1+fibon2;
m.put(n, res);
}

return res;

}


Y ya si quieres calcular con números mas grandes puedes hacerlo con BigInteger de igual forma:

Código (java) [Seleccionar]
public static BigInteger fibonacciGrande(BigInteger n, Map<BigInteger, BigInteger> m){

BigInteger res = new BigInteger("0");

if(n.compareTo(new BigInteger("1"))<=0){
return n;
}else{
BigInteger fibon1 = new BigInteger("0");
BigInteger fibon2 = new BigInteger("0");
if(m.containsKey(n.subtract(new BigInteger("1")))){
fibon1 = m.get(n.subtract(new BigInteger("1")));
}else{
fibon1 = fibonacciGrande(n.subtract(new BigInteger("1")),m);
}

if(m.containsKey(n.subtract(new BigInteger("2")))){
fibon2 = m.get(n.subtract(new BigInteger("2")));
}else{
fibon2 = fibonacciGrande(n.subtract(new BigInteger("2")),m);
}

res = fibon1.add(fibon2);
m.put(n, res);
}

return res;

}


Un saludo.

Exactamente como dice kakimanu, se puede hacer el fibonacci de forma dinámica, aqui les dejo un ejemplo recursivo de la forma dinamica manteniendo los valores ya calculados en un array de long, a mi entender un poquito más sencilla.

Código (csharp) [Seleccionar]
static void Main(string[] args)
        {
            long n = long.Parse(Console.ReadLine()); //Se solicita el termino de fibonacci a calcular
            fibonacci = new long[n+1];
            Console.WriteLine(Fibonacci(n));

        }

        static long Fibonacci(long n)
        {
            if (fibonacci[n] != 0) //Se verifica si no se calculo ya
                return fibonacci[n]; //Se devuelve si ya se calculo
            if (n == 1 || n==2)
                return 1;
            fibonacci[n - 2] = Fibonacci(n - 2); //se guarda en el array
            fibonacci[n - 1] = Fibonacci(n - 1); //se guarda en el array
            return fibonacci[n - 2] + fibonacci[n - 1];
        }

optimus88

n problema de recursividad en C , de la expresion de abajo hay que sacar una definicion de recursividad mostrando el caso base y la funcion recursiva.
El problema es este:

El número de euler es ampliamente utilizado
en el cálculo matemático pero que no puede
ser expresado con un número de decimales
finito. Tiene un valor aproximado de 2,718.
Para poder obtener aproximaciones de
dicho número existen diferentes reglas que
pueden ser aplicadas. Siguiendo un desarrollo
decimal como el mostrado en la figura, puede
obtenerse el número e.
Para poder realizar un algoritmo que realice dicho cálculo aproximado se
requiere crear una función con el siguiente prototipo:
float f_euler(int n)
Esta función devolverá la aproximación del número e aplicando n desarrollos.
Como puede suponer, mientras más grande sea n (más desarrollos serán aplicados),
mejor será la aproximación. Considere los siguientes ejemplos:
f_euler(0)=2
f_euler(1)=2+ 2/2=3
f_euler(2)=2+ 2/(2+ 3/3)= 2.6666...
f_euler(5)=2+ 2/(2+ 3/(3+ 4/(4+ 5/(5+6/6)))))= 2.7184...

konika_bn

Buenas, tengo que hacer este problema de forma recursiva. Sólo se me ocurre implementarlo, pero de forma normal, es decir sin recursión. Si me pudiérais ayudar os lo agradecería.

La factorización de números enteros consiste en descomponer un número compuesto (no primo) en divisores no triviales que cuando se multiplican dan el número original. Para nuestro propósito académico queremos implementar una función recursiva que devuelva el número de divisores distintos de un número dado. Por ejemplo, el número 20 tiene 6 divisores: 1, 2, 4, 5, 10 y 20.

chiche92

Hola, estoy empezando con java estoy en primer año, tengo un problema de recursion que aún no pude solucionar y se me acaba el tiempo, si ustedes pudieran indicarme el camino o resolverlo me ayudarian mucho.

El ejercicio es el siguiente:

Escribir un método recursivo int vocales(String cd) para calcular el número de vocales de una cadena.

Muchas gracias..

abelvaldez

#47
Cita de: pixzeto en 11 Junio 2009, 02:03 AM
Estuve practicando con estos ejercicios y parece que el método para invertir un número no funciona bien.

Por ejemplo, si le entregamos el 32, daría:
2 + invertir(3)*10  =  2 + 3*10  =  32


    int invertir (int n)
   {
if (n < 10)         //caso base
   return n;
else
   return (n % 10) + invertir (n / 10) * 10;
   }



Pero lo hice así y funciona:

public int invertirNumero(int numero){
if(numero<10){
return numero;
}else{
int contador = 0;
int aux = numero;
while(aux/10!=0){
contador++;
aux = aux/10;
}
return (int)(Math.pow(10, contador))*(numero%10) + this.invertirNumero(numero/10);
}
}


Hola Aqui un aporte  :),
utilize String length para identificar el tipo de unidad (../centena/decena) en cada caso.

 int invertir(int n){

           if (n < 10)         //caso base
               return n;

           return invertir(n / 10) + (n % 10) * (int) Math.Pow(10, ((n + "").Length-1));          
           
       }


Y para fibonacci :

        int fibonaci(int [] array, int n) {

            if (array[n-1] > 0) {
                return array[n-1];
            }

            if (n == 1 || n == 2)
            {
                return 1;
            }
            else {

                var a = fibonaci(array ,n - 1);
                var b = fibonaci(array ,n - 2);
                var sum = a + b;
                array[n - 1] = sum;
                 return sum;
            }
        }


jaker250per

int invertir (int n)
    {
if (n < 10)         //caso base
     return n;
else
     return (n % 10) + invertir (n / 10) * 10;
    }

if(numero<10){
   return numero;
  }else{
   int contador = 0;
   int aux = numero;
   while(aux/10!=0){
    contador++;
    aux = aux/10;
   }
   return (int)(Math.pow(10, contador))*(numero%10) + this.invertirNumero(numero/10);
  }
}