La recursividad es una función que se llama a sí misma para dividir un problema en problemas más sencillos, el método recursivo debe estar compuesto de una caso base para el cual ya se conoce un resultado y una llamada al mismo método con una versión ligeramente más sencilla del problema inicial
ejemplo 1, factoriales:
Para todo n entero natural, se llama factorial n (n!) al producto de todos los enteros entre 1 y n:
| n | n! | ||
|---|---|---|---|
| 1 | 1 | 1 | 1 | 
| 2 | 2 × 1 | = 2 × 1! | = 2 | 
| 3 | 3 × 2 × 1 | = 3 × 2! | = 6 | 
| 4 | 4 × 3 × 2 × 1 | = 4 × 3! | = 24 | 
| 5 | 5 × 4 × 3 × 2 × 1 | = 5 × 4! | = 120 | 
| 6 | etc | etc | 
Código:
| 1 2 3 4 5 6 | publicvoidfactoriales(longn){ if(n==1) return1; elsereturnn*factoriales(n-1);} | 
El método factoriales se llama a sí mismo disminuyendo cada vez el numero inicial en una unidad hasta que llega a valer 1 y por lo tanto alcanza el caso base, en ese momento se devuelven todas las llamadas recursivas realizas al método factoriales retornando el valor del actual multiplicado por el valor anterior.
ejemplo 2, Fibonachi:
La sucesion de Fibonachi comienza por 0 y 1, y cada numero siguiente es la
suma de los dos anteriores:
0,1,1,2,3,5,8,13,21,34,55,89
Código:
| 1 2 3 4 5 6 7 | publicvoidfibonachi(longn){ if(n==0|| n==1) returnn; elsereturnfibonachi(n-2)+fibonachi(n-1);} | 
Este método esta compuesto de dos casos bases, y de dos llamadas recursivas al método, a esto se le denomina recursividad mútliple, a diferencia del método factoriales que sólo hace una llamada recursiva y se denomina recursividad simple. En ambos casos es de tipo directa, también es posible efectuar recursión indirectamente: una método puede llamar a otro quien, a su vez, acabe llamando al primero.
A continuación se expone un ejemplo de programa que utiliza recursión indirecta, y nos dice si un número es par o impar. Al igual que el programa anterior, hay otro método mucho más sencillo de determinar si un número es par o impar, basta con determinar el resto de la división entre dos. Por ejemplo: si hacemos par(2) devuelve 1 (cierto). Si hacemos impar(4) devuelve 0 (falso).
 
Código:
| 1 2 3 4 5 6 7 8 9 10 11 | intpar(intn){  if(n == 0) return1;  returnimpar(n-1);}intimpar(intn){  if(n == 0) return0;  returnpar(n-1);} | 
 Código: 
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | intx[]={7,3,4,6,8,9,5};        intn = 7;        // Enviamos datos        max(n, x); publicstaticintmax(intn, intx[])    {        if(n == 1)            returnx[0];        if(x[n-1] > max(n-1, x))            returnx[n-1];        else            returnmax(n-1, x);    } | 
Hay que apuntar que el factorial puede obtenerse con facilidad sin necesidad de emplear funciones recursivas, es más, el uso del programa anterior es muy ineficiente, pero es un ejemplo muy claro.
Dado un array constituido de números enteros, devolver la suma de todos los elementos. En este caso se desconoce el número de elementos. En cualquier caso se garantiza que el último elemento del array es -1, número que no aparecerá en ninguna otra posición.
Código:
| 1 2 3 4 5 6 7 8 9 | privatestaticintsumaArray2(intvector[], intn){       if(n==-1)return0;       elsereturnvector[n]+ sumaArray2(vector, n-1);   }staticint[]array={1,2,3,4,5,6};System.out.println(sumaArray2(array,array.length-1)); | 
Dado un array constituido de números enteros y que contiene N elementos siendo N >= 1, devolver el elemento mayor.
Código:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | staticint[]array={510,41,300,4,25,6}; privatestaticintmayor(intvector[], intn){       intaux;       if(n==-1)return0;       else{           aux = mayor(vector, n-1);           if(vector[n]>aux)               returnvector[n];           else               returnaux;       }   }  System.out.println(mayor(array,array.length-1)); | 
máximo comun divisor.
Código:
| 1 2 3 4 5 6 7 8 9 10 | privatestaticlongmcd(longa, longb){       if(b==0)           returna;       elsereturnmcd(b,a%b);   }  System.out.println(mcd(80,25));resultado 5; | 
Video utilizando Recursividad
 
No hay comentarios:
Publicar un comentario