jueves, 7 de abril de 2011

La Recursividad




Un algoritmo recursivo no es más que aquel que posee la capacidad de solicitar el mismo su ejecución las veces que sea necesario hasta llegar a un caso base, el algoritmo solamente sabe resolver ese caso, de manera que expresa todos los demás en función de este.

Bueno, basta de teoría aburrida y ocupémonos de lo que en verdad importa, la recursividad llega a ser un problema para muchos programadores, ya que si bien ésta se traduce en algoritmos más simples en código, su análisis es mucho más complejo, otra cosa que hay que tomar en cuenta es que a nivel de optimización de los recursos los algoritmos recursivos consumen más que los iterativos, de manera que siempre QUE PUEDAS HACERLO UTILIZA ITERACION EN LUGAR DE RECURSION.

3 Cosas a Tomar en Cuenta

1. NUNCA PONGAS UN CONTADOR O ACUMULADOR DENTRO DE LA FUNCION: Hay una regla de el mundo 2.0 que dice ”Si está en mayúsculas es porque es importante”, éste es el error más común que se comete. Una variable que cuenta o que acumule necesariamente debe inicializarse al comienzo de la función, de manera que no importa que tanto hayas modificado dicha variable, en la siguiente llamada recursiva siempre tendrá el valor con la cual la inicializaste.



ESTO ES LO QUE NO SE DEBE HACER

2. SI NECESITAS CONTAR O ACUMULAR UTILIZA EL ARGUMENTO DE LA FUNCION: En los algoritmos recursivos esta es la forma de hacerlo, crea un parámetro donde incluya la variable de interés y que se incremente en cada llamada recursiva.

En este caso, cuando se haga la llamada a la función se le pasa 0 como parámetro en el campo anostranscurridos.


3. ASEGURATE DE LLEGAR AL CASO BASE: Así como en los métodos iterativos es necesario que se llegue en algún momento al final del algoritmo lo mismo sucede aquí,es necesario que la modificación de las variables se produzca de tal manera que sea posible llegar al caso base.


A continuación les presento una colección de los algoritmos recursivos mas comunes que se presentan en los cursos de programación, con el tiempo ire editando el post y agregando mas:


Cargar Arreglo Recursivamente:

class Arreglos {

private int Arreglo[];

Arreglos(int longitud) { Arreglo=new int [longitud];

}

public String llenadoRecursivo(int longitud,int indice)

{ String salida; if(indice==longitud)

{ return "Arreglo Cargado";}

else { salida=JOptionPane.showInputDialog("Ingrese valor");

Arreglo[indice]=Integer.parseInt(salida);

return(llenadoRecursivo(longitud,indice+1));}}



Muestra Arreglo Recursivamente

public String muestraRecursivo(int longitud,int indice,String salida)

{ if(indice==longitud)

{return salida;}

else { salida+=Arreglo[indice]+"\n";

return(muestraRecursivo(longitud,indice+1,salida))

;}}



public int fib(int s)

{ if (s<= 1) return s;

else return fib(s-1) + fib(s-2);

}


Determina recursivamente si una palabra es palindrome o no

public boolean Recursiva(int i,int j)

{

if(i==j(i+1)==j) return true;

else { if( Palabra[i]==(Palabra[j]))

{ return Recursiva(i+1,j-1);

}

else

return false; }


Calculo recursivo de una potencia

public static int potencia(int base,int exponente)

{ if (exponente== 0)

{ return 1;}

if (exponente == 1)

{ return exponente;}

else{ return b * potencia( base, exponente-1);}}


Calculo Recursivo de un factorial

public static int factorial(int n)

{ if ( (n==0) (n==1) )

{ return 1; }

else{ return n*factorial(n-1); }

1 comentario:

  1. jejejeje me gusta esa imagen,

    voy a tratar de pasar el codigo a eclipse para que pueda ser compilado desde cualquier compilador, ya que netbeants usa unos repositorios todo raros ahi.

    ResponderEliminar