Você está na página 1de 13

Definicin Recursividad

Capacidad que tiene los mtodos de invocarse as mismos, esta es una potente
herramienta en la informtica.
Con esta herramienta muchos algoritmos pueden simplificarse
significativamente.

4.2 Procedimientos Recursivos.


La recursividad es una tcnica de programacin importante. Se utiliza para
realizar una llamada a una funcion desde la misma funcion. Como ejemplo til
se puede presentar el clculo de nmeros factoriales. l factorial de 0 es, por
definicin,

1. Los factoriales de nmeros mayores se calculan mediante la multiplicacin


de 1 * 2 * , incrementando el nmero de 1 en 1 hasta llegar al nmero para
el que se est calculando el factorial.
El siguiente prrafo muestra una funcin, expresada con palabras, que calcula
un factorial.
Si el nmero es menor que cero, se rechaza. Si no es un entero, se redondea
al siguiente entero. Si el nmero es cero, su factorial es uno. Si el nmero es
mayor que cero, se multiplica por l factorial del nmero menor inmediato.
Para calcular el factorial de cualquier nmero mayor que cero hay que calcular
como mnimo el factorial de otro nmero. La funcin que se utiliza es la funcin
en la que se encuentra en estos momentos, esta funcin debe llamarse a s
misma para el nmero menor inmediato, para poder ejecutarse en el nmero
actual. Esto es un ejemplo de recursividad.
La recursividad es un concepto importante en informtica. Muchos algoritmos
se pueden describir mejor en trminos de recursividad.

Supongamos que P es un procedimiento que contiene una sentencia de


Llamada a si mismo o una sentencia de Llamada a un segundo procedimiento
que puede eventualmente llamar de vuelta al procedimiento original P.
Entonces P se dice que es u procedimiento recursivo. Como el programa no ha

de continuar ejecutndose indefinidamente, un procedimiento recursivo ha de


tener las dos siguientes propiedades:
(1) Debe existir un cierto criterio, llamado criterio base, por el que el
procedimiento no se llama as mismo.
(2) Cada vez que el procedimiento se llame a si mismo (directa o
indirectamente), debe estar ms cerca del criterio base.
Un procedimiento recursivo con estas dos propiedades se dice que est bien
definido.
Similarmente, una funcin se dice que esta definida recursivamente si la
definicin de la funcion se refiere a si misma. De nuevo, para que la definicion
no sea circular, debe tener las dos siguientes propiedades:
(1) Debe haber ciertos argumentos, llamados valores base, para los que la
funcion no se refiera a si misma.
(2) Cada vez que la funcion se refiera a si misma, el argumento de la funcion
debe acercarse mas al valor base.
Una funcion recursiva con estas dos propiedades se dice tambien que esta bien
definida.
Tipos.
Podemos distinguir dos tipos de recursividad:
Directa: Cuando un subprograma se llama a si mismo una o mas veces
directamente. Indirecta: Cuando se definen una serie de subprogramas
usndose unos a otros.
Caractersticas.
Un algoritmo recursivo consta de una parte recursiva, otra iterativa o no
recursiva y un acondicin de terminacin. La parte recursiva y la condicin de
terminacin siempre existen. En cambio la parte no recursiva puede coincidir
con la condicin de terminacin. Algo muy importante a tener en cuenta
cuando usemos la recursividad es que es necesario asegurarnos que llega un
momento en que no hacemos ms llamadas recursivas. Si no se cumple esta
condicin el programa no parar nunca.
Ventajas e inconvenientes. La principal ventaja es la simplicidad de
comprensin y su gran potencia, favoreciendo la resolucin de problemas de
manera natural, sencilla y elegante; y facilidad para comprobar y convencerse
de que la solucin del problema es correcta. El principal inconveniente es la
ineficiencia tanto en tiempo como en memoria, dado que para permitir su uso

es necesario transformar el programa recursivo en otro iterativo, que utiliza


bucles y pilas para almacenar las variables.

4.3 Mecnica Recursin.

La mecnica de la recursividad est basada en una pila. Cuando un mdulo


recursivo se est ejecutando se crea en la memoria de la computadora una pila
donde se almacenan los valores de los parmetros y de las variables locales
del mdulo. Si el mdulo es funcin tambin se guarda en la pila el valor que
adquiere la misma.
Para cada llamada del mdulo se almacenan en la pila los nuevos valores de
los parmetros y de las variables locales, crendose un nuevo registro de
activacin. De tal forma que, la pila de recursin est formada por registros de
activacin. Al terminar una llamada al mdulo, es decir, cuando se cumple la
definicin base, se libera (sale) el registro de activacin que se encuentra en el
tope de la pila. De esta forma es como puede recordar qu valores tenan los
parmetros y las variables locales en la llamada anterior.
Si observamos el proceso que seguimos para calcular 4! vemos que el valor de
n fue cambiando conforme fuimos entrando en recursin y que al salir de
recursin necesitbamos recordar el valor que tena n en la expresin anterior.
Esto quiere decir que los valores que fue adquiriendo n fueron entrando a la
pila.
No slo debe recordar los valores que tenan los parmetros y las variables
locales al realizarse la correspondiente llamada al mdulo sino que tambin
tiene que recordar qu instruccin debe realizar al terminar esa llamada. De tal
forma que los registros de activacin estn compuestos bsicamente de:

1. Instruccin a la que debe regresar el control una vez terminada la ejecucin


actual del mdulo.
2. Todos los parmetros y variables locales del mdulo.
3. Si el mdulo recursivo es una funcin el valor que adquiere la misma, ya que
ste se debe regresar.

Para hacer la representacin de la pila de recursin numeramos las


instrucciones a las que debe regresar el control una vez terminada la ejecucin
del mdulo recursivo y estos valores son los que ponemos en la pila.

4.4 Transformacin Algoritmos Recursivos a Iterativos


El concepto de recursividad va ligado al de repeticin. Son recursivos aquellos
algoritmos que, estando encapsulados dentro de una funcin, son llamados
desde ella misma una y otra vez, en contraposicin a los algoritmos iterativos,
que hacen uso de ciclos while, do-while, for, etc.
Algo es recursivo si se define en trminos de s mismo (cuando para definirse
hace mencin a s mismo). Para que una definicin recursiva sea vlida, la
referencia a s misma debe ser relativamente ms sencilla que el caso
considerado.
Ejemplo: definicin de n natural:
el N 0 es natural
El N n es natural si n-1 lo es.
En un algoritmo recursivo distinguimos como mnimo 2 partes:
a). Caso trivial, base o de fin de recursin:

Es un caso donde el problema puede resolverse sin tener que hacer uso de una
nueva llamada a s mismo. Evita la continuacin indefinida de las partes
recursivas.
b). Parte puramente recursiva:
Relaciona el resultado del algoritmo con resultados de casos ms simples. Se
hacen nuevas llamadas a la funcin, pero estn ms prximas al caso base.
4.5 Recursividad en Diseo
Un procedimiento recursivo es aquel que se llama a si mismo, para poder
funcionar tiene que tener una condicin de salida que de el numero de veces
que se va a llamar a si mismo el procedimiento.
La recursividad en diseo se refiere a la manera de cmo representar los
procedimientos recursivos al momento de disear los programas.

Dependiendo del mtodo que utilicemos para disear la representacin grafica


de la recursividad va a ser diferente sin embargo el procedimiento va a ser
similar ya que el fin es el mismo poner una condicin que nos diga si llamamos
al mtodo o que nos mande terminarlo.
En un diagrama seria algo as:

4.6 Complejidad Algoritmos Recursivos


Un algoritmo recursivo es un algoritmo que se define en trminos de s mismo.
Son implementados en forma de subprogramas (funciones, subrutinas,
procedimientos, etc) de tal forma que dentro de un subprograma recursivo hay
una o ms llamadas a l mismo.
FUNCIN Factorial(n)
INICIO
SI (n<2) factorial =" 1;" factorial =" n">
Bibliografa
Consulta a libros:
Autores:
Alfred V. Aho
John E. Hopcroft
Jefrey D. Ullman
Libro:
Estructura De Datos Y Algoritmos
Editorial: Addison-Wesley Iberoamericana
Edicin: Revisada
REFERENCIAS DE INTERNET
http://arco.esi.uclm.es/~david.villa/pensar_en_C+
+/products/vol1/ch03s02s09.html

Definicin
Recursin es una tcnica de programacin en el cual un mtodo puede
llamarse a s mismo. La recursin es muy interesante y una tcnica efectiva en
programacin ya que puede producir algoritmos cortos y eficientes.
Algo es recursivo si se define en trminos de s mismo (cuando para definirse
hace mencin a s mismo).
Si la invocacin de un subprograma (funcin o subrutina) se produce desde el
propio subprograma se dice que se trata de un subprograma recursivo.
Un mtodo recursivo es un mtodo, directa o indirectamente, se hace una
llamada a s mismo.
La recursin consiste en el uso de mtodos recursivos.
2.2 Procedimientos recursivos
Los procedimientos recursivos o recurrentes se pueden clasificar en dos formas
distintas:
-

Recursividad directa o

Recursividad indirecta

La recursividad directa se presenta cuando el mtodo se manda llamar a s


mismo dentro de su propio cuerpo de instrucciones.
public int Metodo(int n)
{
:
n = Metodo(n-1);
}
La recursividad indirecta se manifiesta cundo un mtodo llama a otro y dentro
del segundo se manda llamar al primero. O cuando existe la llamada a mtodos
de forma encadenada y al terminar el ltimo mtodo llamado, transfiere el
control al anterior, hasta llegar al mtodo que inicio la serie de llamadas.

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 clasificacin, puede indicar que es
un procedimiento infinito, que solo se detendr en el momento que se agote la
memoria, generando un error de programacin y la interrupcin 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 mtodo recursivo o
recurrente.
Forma de generar la recursividad
Un problema clsico: El factorial de un nmero.
Todos conocemos que la definicin matemtica del factorial de un nmero n se
obtiene de la siguiente forma:
n! = 1*2*3*.......*n n! = n*(n-1)*(n-2)*.....1
Por definicin matemtica, tambin sabemos que:
0! = 1
Con lo que tendramos la siguiente definicin de factorial:

n!

1
n*(n-1)

Si n=0

Caso Base

Otros casos Parte Recursiva

Un problema que puede resolverse de manera recursiva, debe tener por lo


menos caso base y 1 parte recursiva, sino no hay recursin.

Ahora, para implementarlo en un lenguaje de programacin como Java, solo


tenemos que traducir nuestros casos bases y partes recursivas:

Funcionamiento del proceso


n

Llamado a factorial

4*factorial(3)

3*factorial(2)

2
1
0

2*factorial(1)
1*factorial(0)
1

En general el proceso es (4*factorial(3*factorial(2*factorial(1*factorial(0)))))


Realizar de manera recursiva la sumatoria de n nmeros naturales de manera
recursiva.
La sumatoria de n nmeros se realiza de la siguiente forma:
n=10
1+2+3+4+5+6+7+8+9+10 = 10+9+8+7+6+5+4+3+2+1

De tal forma que podemos determinar que:


1

si n = 1

paso bsico

n + (n-1)

si n > 1

paso inductivo o proceso recursivo

//5+suma(4+suma(3+suma(2+suma(1))))

Imprimir de manera recursiva la serie de fibonnaci


La serie de fibonacci trabaja de la siguiente forma:
Paso 1: Si tenemos dos semillas formadas por s1=0 y s1=1
01
Paso 2. Se suman para obtener el resultado
011
Ahora la semilla 1 se queda con el valor de la semilla 2 y el resultado se asigna
a la semilla 2 y se vuelve a realizar el paso 2. De tal forma que la serie queda
de la siguiente forma:
0 1 1 2 3 5 8 13 21 34 55 89 .

Fibonnacci de manera recursiva

Fibonacci(0,1,21)=1
Fibonacci(1,1,21)=2
Fibonacci(1,2,21)=3
Fibonacci(2,3,21)=5
Fibonacci(3,5,21)=8
Fibonacci(5,8,21)=13
Fibonacci(8,13,21)=21

Realizar de manera recursiva la potencia de un nmero para n.


El clculo de la potencia de un nmero se resuelve de la siguiente manera.
Xp=X*X(p-1)*X(p-2)*X(p-3)= 25= 2 * 2 * 2 * 2 * 2
Sabemos que 20= 1 por lo que determinamos

si p = 0

paso bsico

n * (n, p-1)

si p > 0

paso inductivo

24 2*potencia(2*potencia(2*potencia(2*potencia(2,0))
Potencia(2,4)=2*potencia(2,3)=16
Potencia(2,3)=2*potencia(2,2)=8
Potencia(2,2)=2*potencia(2,1)=4
Potencia(2,1)=2*potencia(2,0)=2
Potencia(2,0)=1

Realizar el producto de un nmero por sumas sucesivas de manera recursiva.


El producto de un nmero (3*9) se realiza de la siguiente forma:
1 2 3 4 5 6 7 8 9
3+3+3+3+3+3+3+3+3

cant =0
n+(cant-1)

caso base
proceso recursivo

Realizar de manera recursiva como calcular un nmero en binario a travs de


desplazamientos sucesivos
La manera de convertir a binario un nmero es de la siguiente forma:
Si es para un nmero de ocho bits el rango de valores abarca de 0 a 255, si es
en ese caso se debe de utilizar una mscara de 0x80. Que representa a un
nmero en binario 10000000 es decir el ltimo bit en 1.
Se realiza una operacin (AND)& a nivel de bits del nmero a convertir y si el
resultado es cero entonces ese representa al primer valor del nmero en
binario y si no es cero entonces este lo representa.

Posterior a esto se desplaza el bit una posicin a la derecha y se vuelve a hacer


la misma operacin & y nos vuelve a dar como resultado 0 o un numero
diferente de 0.
Este proceso se repite hasta que se llegue hasta el final # de bits. En este caso
8 iteraciones.
Ejemplo:
Numero a convertir es 13
La mscara es 0x80=10000000

13 en binario es 00001101
La mscara es 10000000
Resultado &

00000000

da el primer valor del nmero convertido 0

Se repite el mismo proceso pero con el bit 1 de la mscara recorrido una


posicin a la derecha.

13 en binario es 00001101
La mscara es 01000000
Resultado &

00000000

da el primer valor del nmero convertido 0

13 en binario es 00001101
La mscara es 00100000
Resultado &

00000000

da el primer valor del nmero convertido 0

13 en binario es 00001101
La mscara es 00010000
Resultado &

00000000

da el primer valor del nmero convertido 0

13 en binario es 00001101
La mscara es 00001000
Resultado &

00001000

da el primer valor del nmero convertido 1

13 en binario es 00001101
La mscara es 00000100
Resultado &

00000100

da el primer valor del nmero convertido 1

13 en binario es 00001101
La mscara es 00000010
Resultado &

00000000

da el primer valor del nmero convertido 0

13 en binario es 00001101
La mscara es 00000001
Resultado &

00000000

da el primer valor del nmero convertido 1

Realizar un procedimiento recursivo para calcular la suma de un vector de n


nmeros.

* Realizar un procedimiento que imprima de manera recursiva los numeros del


1al 10
* Realizar un procedimiento que imprima de manera recursiva la tabla del 9
*Realizar un procedimiento que encuentre el numero mayor de un vector de n
numeros enteros de manera recursiva.

Primero debemos decir que la recursividad no es una estructura de datos, sino


que es una tcnica de programacin que nos permite que un bloque de
instrucciones se ejecute n veces. Remplaza en ocasiones a estructuras
repetitivas.
Este concepto ser de gran utilidad para el captulo de la estructura de datos
tipo rbol.
La recursividad es un concepto difcil de entender en principio, pero luego de
analizar diferentes problemas aparecen puntos comunes.
En Java los mtodos pueden llamarse a s mismos. Si dentro de un mtodo
existe la llamada a s mismo decimos que el mtodo es recursivo.
Cuando un mtodo se llama a s mismo, se asigna espacio en la pila para las
nuevas variables locales y parmetros.
Al volver de una llamada recursiva, se recuperan de la pila las variables locales
y los parmetros antiguos y la ejecucin se reanuda en el punto de la llamada
al mtodo.

Você também pode gostar