Está en la página 1de 7

Capítulo

II

Recursividad

Competencias especificas:
Aplica la recursividad en la solución de problemas valorando
su pertinencia en el uso eficaz de los recursos.
Capítulo II Recursividad

2.1 Definición de Recursividad


1) La recursividad es un concepto fundamental en matemáticas y en
computación. Es una alternativa diferente para implementar estructuras de
repetición (ciclos). Se puede usar en toda situación en la cual la solución
pueda ser expresada como una secuencia de movimientos, pasos o
transformaciones gobernadas por un conjunto de reglas no ambiguas.
(Ziviani, Nivio, 2007)

2) Es una técnica de programación que permite ejecutar el mismo conjunto de


instrucciones de un algoritmo n veces, para dar solución a un problema
determinado, en cada ejecución del algoritmo, el problema se va reduciendo,
hasta llegar a su solución final, conocido como caso base.

Esta técnica no se puede aplicar a todos los algoritmos, para utilizar la


recursividad, es necesario considerar que se cumplan las siguientes
características del problema a resolver:

a) Los problemas pueden ser redefinidos en términos de uno o más


subproblemas, idénticos en naturaleza al problema original, pero de alguna
forma menores en tamaño.
b) Uno o más subproblemas tienen solución directa o conocida, no recursiva. c)
Aplicando la redefinición del problema en términos de problemas más pequeños,
dicho problema se reduce sucesivamente a los subproblemas cuyas soluciones
se conocen directamente.
d) La solución a los problemas más simples se utiliza para construir la solución
al problema inicial.

Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de


construcción. La base no es recursiva y es el punto tanto de partida como de
terminación de la definición, como por ejemplo el cálculo del factorial de un
número el cual se muestra a continuación:

1 si N=0 (es el caso base)


N!=
N*(N-1)! si N>0 (recursión)

Una de las razones para diseñar algoritmos recursivos, es la cercanía a la


descripción

matemática del problema a resolver, su solución es mejor que utilizando


estructuras
de repetición y proporciona un diseño estructurado simple.

2.2 Procedimientos recursivos


Todos los métodos recursivos deben obedecer tres leyes importantes:

8
Capítulo II Recursividad

a) Un método recursivo debe tener un caso base.


b) Un método recursivo debe cambiar su estado y moverse hacia el caso
base. c) Un método recursivo debe llamarse a sí mismo, recursivamente.

Los procedimientos recursivos o recurrentes se pueden clasificar en dos formas


distintas:

a) Recursividad directa o
b) Recursividad indirecta

La recursividad directa se presenta cuando el método se manda llamar a sí


mismo dentro de su propio cuerpo de instrucciones, por ejemplo:

public int Metodo(int n)


{
:
:
n = Metodo(n-1);
}

La recursividad indirecta se manifiesta cundo un método llama a otro y dentro


del segundo se manda llamar al primero. O cuando existe la llamada a métodos
de forma encadenada y al terminar el último método llamado, transfiere el
control al anterior, hasta llegar al método que inicio la serie de llamadas, por
ejemplo se tiene lo siguiente:

public int Metodo1(int n)


{
:
:
n = Metodo2(n-1);
}

public int Metodo2(int n)


{
:
:
n = Metodo1(n-1);
}

Analizando el concepto de recursividad y su clasificación, puede indicar que es


un procedimiento infinito, que solo se detendrá en el momento que se agote la
memoria, generando un error de programación y la interrupción del mismo. Pero
esto no es así, ya que debe existir un elemento que indica el retorno de un
resultado concreto y no el retorno de la llamada al método recursivo o
recurrente. (Ziviani, Nivio, 2007)

9
Capítulo II Recursividad

2.3 Ejemplos de casos recursivos


En el contexto de la computación, existe una infinidad de algoritmos recursivos,
que se han tomado como base para la enseñanza-aprendizaje de esta técnica
de programación, a continuación se muestra solo algunos de los casos, los que
se consideran más básicos en un curso de programación, cabe señalar que se
encuentran implementados en métodos diseñados en lenguaje Java:

Ejemplo 1
Aplicar la técnica de recursividad para calcular la exponenciación ab, recordando
que matemáticamente se tiene la siguiente consideración:

ab = a*ab-1 si b≥ 1
Cuando b=0 a0=1

public long exp(long a,long b){


if (b==0)
return 1;
else
return a * exp(a, b-1);
}

Ejemplo 2
La definición recursiva del factorial de un numero n>0, considerando que 0!=1
por definición, se obtiene como consecuencia de aplicar la propiedad asociativa
de la multiplicación, es decir:

n!=n*(n-1)*(n-2)*. . . . .*2*1

asociando los factores de la siguiente forma, se tiene


n!=n*[(n-1)*(n-2)* . . . .*2*1]
se tiene que
n!=n*(n-1)!

Así pues la versión recursiva del factorial es:


1 si N=0 (es el caso base)
N!=
N*(N-1)! si N>0 (recursión)

El método recursivo resultante bajo estas consideraciones es:


public class Recursividad {

int factorial(int fact) {


if (fact>0) {

10
Capítulo II Recursividad

int valor=fact * factorial(fact-1);


return valor;
} else
return 1;
}

public static void main(String[] ar) {


Recursividad re=new Recursividad();
int f=re.factorial(4);
System.out.println("El factorial de 4 es "+f);
}
}

Ejemplo 3
Suma de elementos de un arreglo: La idea de este algoritmo es realizar la suma
de todos los elementos de un arreglo de manera recursiva, para lo cual es
necesario encontrar el primer elemento del arreglo y a partir de él de manera
recursiva hacer la recuperación de cada casilla del arreglo de manera que se
sume cada elemento del arreglo hasta llegar al último elemento del arreglo
representado por n.

public int suma(int arreglo, int n)


{
if (n == 0)
return arreglo[0];
else
return arreglo[n] + suma(arreglo, n-1);
}
Ejemplo 4
Máximo elemento en un arreglo: La idea básica en este algoritmo es encontrar el
número de mayor valor dentro de un arreglo de elementos, para lograrlo
recorreremos todo el arreglo de fin a inicio de manera recursiva y en cada
retroceso compararemos el valor actual de la llamada con el resultado anterior a
ella:

public int maximo(int arreglo, int n) {


if (n == 0)
return arreglo[0];
else {
int y = maximo(arreglo, n-1);
return ( arreglo[n] > y ? arreglo [n]: y );
}
}

11
Capítulo II Recursividad

Ejemplo 5
En matemáticas, la sucesión de Fibonacci es la siguiente sucesión infinita de
números naturales:
0,1,1,2,3,5,8,13,21,34,55……..

La sucesión comienza con los números 0 y 1,2 y a partir de estos, cada término
es la suma de los dos anteriores, es la relación de recurrencia que la define.

La función recursiva f(n) para el cálculo de la secuencia de Fibonacci es:

Casos base (de salida, no se produce llamada recursiva):


f(0) = 0
f(1) = 1

Caso recursivo:
f(n) = f(n-1) + f(n-2)

luego entonces tenemos la implementación del método en Java para la


obtención de la serie de fibonaci:

public int fibonaci(int n){


if (n==1 || n==2)
return 1;
else
return fibonaci(n-1)+fibonaci(n-2);
}

Ventajas y desventajas de la recursividad


Las funciones recursivas son mecanismo muy eficientes de programación pues
facilitan el diseño de las mismas, sin embargo la recursividad no es en todos los
casos un buen modo de resolver problemas, ya que existen casos en los que un
algoritmo iterativo resolvería de manera bastante adecuada un problema
determinado. La recursividad consume recursos adicionales de memoria y
tiempo de ejecución, y se debe aplicar a funciones que realmente obtengan
beneficio directo.

12

También podría gustarte