Ejercicios Recursivos en Java y sus Soluciones

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

0 Miembros y 2 Visitantes están viendo este tema.

pavelinhos

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);
}
}

Aqui un aporte mio:

public String Invertir(int num){
            if (num < 10)
                return String.valueOf(num);
            else
                return String.valueOf(num%10) + Invertir(num/10);
        }

criptofan

#21
Cita de: pavelinhos en 26 Noviembre 2010, 21:35 PM
Aqui un aporte mio:

public String Invertir(int num){
           if (num < 10)
               return String.valueOf(num);
           else
               return String.valueOf(num%10) + Invertir(num/10);
       }


Aunque ojo que ahí se esta retornado un String y no un int como es pedido, claramente esto simplifica extremadamente el código por que la suma de cadenas de caracteres simplemente se concatenan a diferencia de la suma de números donde se deben elevar los dígitos a la potencia respectiva para lograr invertir el número. De todas maneras, me gusto mucho tu implementación :)
Agrego otra implementación:

   public static int invertir(int n)
   {
      if(n/10==0)
         return n;
      else
      {
         String s=String.valueOf(n);
         int aux=n;
         int contador=s.length();
         while(aux%10!=0)
         {
         contador--;
         break;
         }
         return (int) ((n%10)*Math.pow(10, contador)+invertir(n/10));
      }
   }


Saludos

pavelinhos

Cita de: criptofan en  4 Diciembre 2010, 20:11 PM
Aunque ojo que ahí se esta retornado un String y no un int como es pedido, claramente esto simplifica extremadamente el código por que la suma de cadenas de caracteres simplemente se concatenan a diferencia de la suma de números donde se deben elevar los dígitos a la potencia respectiva para lograr invertir el número. De todas maneras, me gusto mucho tu implementación :)

Saludos
Otra manera seria, convertir el String en un int luego de invertir:
Código (java) [Seleccionar]

public int Invertir(int num){
          String r;
            if (num < 10)
                r= String.valueOf(num);
            else
                r= String.valueOf(num%10) + Invertir(num/10);
          return Integer.parseInt(r);
        }


hecter

Esta funcion utilizando la misma logica de recursividad de la idea original funciona
FUNCTION invertir(n INTEGER) RETURN INTEGER deterministic AS
    vnumDig      integer;
    vnuParEntera pls_integer;
  BEGIN
    vnuParEntera := trunc(n, 0);
    vnumDig      := fnugetNumOfDig(vnuParEntera);--esta es una funcion que me obtiene el numero de digito
    if vnumDig = 1 then
      return vnuParEntera;
    end if;
    return(vnuParEntera mod 10) * Power(10, vnumDig - 1) + invertir(vnuParEntera / 10);
  END invertir;

hecter

  FUNCTION invertir(n INTEGER) RETURN INTEGER deterministic AS
    vnumDig      integer;
    vnuParEntera pls_integer;
  BEGIN
    vnuParEntera := trunc(n, 0);
    vnumDig      := fnugetNumOfDig(vnuParEntera);--esta es una funcion que me obtiene el numero de digito
    if vnumDig = 1 then
      return vnuParEntera;
    end if;
    return(vnuParEntera mod 10) * Power(10, vnumDig - 1) + invertir(vnuParEntera / 10);
  END invertir;

steven17

Como haria yo para implementar una función de recursividad para copiar arreglos hasta llenar la memoria.

Es que ocupo crear un programa que cree un arreglo que se llene con mil numeros enteros y despues que haga copias de ese arreglo hasta caer en fallos de memoria

.rn3w.

aki les mando el metodo invertir en forma recursiva
public int invertir(int n){
    int res=0;
    if(n<10){
        res=n;
    }
    else{
    res=(n % 10)*(int)Math.pow(10, cantDigitos(n)-1) + invertir(n / 10);
    }
    return res;
    }

.rn3w.

estuve revisando los metodos realizados en esta pagina y
en la mayoria de los metodos vi un error que no es tan error

este es mi consejo y tomenlo del lado positivo vale

   utilizan mucho el return y lo aconsejable es que solo se invoke el return
                     solo una 1 ves

bye y viva la ufc

.rn3w.

hola a todos bueno
aki les dejo un programita que les sirva de mucho lo interesante de este metodo es
que hace 3 veces la llamada recursiva
1
21
321
4321
54321
654321
asi sucecivamente
public int triangulo(int n){
        int res=0;
        if(n==1){
            res=1;
        }
        else{
            res=(int)Math.pow(10,cantDigitos(triangulo(n-1) ))*n+triangulo(n-1);
        }
        return res;
    }

AleX Inc.

Me dejaron de tarea el ejercicio 13, que coincidencia :P
Aqui lo dejo por si les sirve de algo ver otra manera de resolver el cuadro latino, yo use menos parametros.
PD: Adjunto la api para que lo prueben.
public void cLatino(int[][]mt, int fila, int col)
{
if ( (fila+col+1)==mt.length )
mt[fila][col] = 1;
else if ( (fila+col)>=mt.length )
mt[fila][col] = (fila+col+2)-mt.length;

if ( col<mt.length-1 ) col++;
else if ( fila<mt.length-1 ) { fila++; col=0; }
else return;

cLatino(mt,fila,col);
}

public void Latino(int[][]Mt)
{ cLatino(Mt,0,0); }

Api:
http://upwap.ru/1455317