Está en la página 1de 37

Algoritmos y Estructuras de Datos

Recursividad

Ejemplo Matr shka Matrushka

La Matrushka es una artesana tradicional rusa. Es una mueca de madera que contiene otra mueca ms pequea dentro de s. Esta mueca, tambin contiene otra mueca dentro. Y as, una dentro de otra as otra.

Qu es la recursividad?

La recursividad es un concepto fundamental en matemticas y en computacin. Es una alternativa diferente para implementar estructuras de repeticin (ciclos). Los mdulos se hacen llamadas recursivas recursivas. Se puede usar en toda situacin en la cual la so uc solucin pueda ser expresada como una se e p esada co o u a secuencia de movimientos, pasos o transformaciones gobernadas por un conjunto de reglas no ambiguas ambiguas.
3

Funcin recursiva
Las funciones recursivas se componen d L f i i de: Caso base: una solucin simple para un caso particular (puede haber ms de un caso base). La secuenciacin, iteracin condicional y seleccin son estructuras vlidas de control que pueden ser consideradas como enunciados.
NOTA: Regla recursiva Las estructuras de control que se pueden formar combinando de manera vlida la secuenciacin, iteracin condicional y seleccin tambin son vlidos vlidos.
4

Funcin recursiva

Caso recursivo: una solucin que involucra volver a utilizar la funcin original, con parmetros que se acercan ms al caso base. Los pasos que sigue el caso recursivo son los siguientes:
1. El procedimiento se llama a s mismo p 2. El problema se resuelve, resolviendo el mismo problema pero de tamao menor 3. La 3 L manera en l cual el t la l l tamao d l del problema disminuye asegura que el caso base eventualmente se alcanzar
5

Funcin recursiva F ncin rec rsi a

Ejemplo: Ejemplo factorial


Escribe un programa que calcule el factorial (!) de un entero no negativo. He aqu algunos ejemplos de factoriales:

0! = 1 1! = 1 2! = 2 3! = 6 4! = 24 5! = 120

2! = 2 * 1! 3! = 3 * 2! 4! = 4 * 3! 5! = 5 * 4!
7

Ejemplo: f t i l (iterativo) Ej l factorial


Accion factorial es Ingresar (n) fact := 1 para i := 1 a n h hacer fact := i * fact fin para p Escribir (factorial de , n, es , fact) Fin Fi accion i Function factorial (n: integer): integer; var fact: integer; Begin factorial := 1; for i := 1 to n do factorial:= factorial *i; end.
8

Ejemplo: f t i l (recursivo) Ej l factorial


accion factorial (int n) si n = 0 entonces factorial:=1 f t i l 1 contrario factorial:=n factorial(n-1) factorial:=n* factorial(n 1) Finsi Fin accion
Function factorial (n: integer): integer; var fact: integer; Begin

if n = 0 then Factorial:= 1 else Factorial:= n *factorial (n-1);


End.
9

Ejemplo: Ejemplo

A continuacin se puede ver la secuencia de factoriales.


0!

=1 1! = 1 = 1 * 1 = 1 * 0! 2! = 2 = 2 * 1 = 2 * 1! = 3 * 2 = 3 * 2! 3! = 6 4! = 24 = 4 * 6 = 4 * 3! 5! = 120 = 5 * 24 = 5 * 4! ... = N * (N 1)! N! =


10

11

Solucin Sol cin


Aqu podemos ver la secuencia que toma el factorial

1 N! = N * (N 1) !

si N = 0 (base)

si N > 0 (recursin)

Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de construccin. La base no es recursiva y p p es el punto tanto de partida como de terminacin de la definicin.
12

Solucin Recursiva
Dado un entero no negativo x, regresar el factorial de x Considerar que l entrada es un n entero no negativo, y l C id la t d t ti la salida tambin es un entero. accion factorial (int n) si n = 0 entonces factorial:=1 contrario factorial:=n* factorial(n 1) factorial(n-1) Finsi Fin accion
Es importante determinar un caso base, es decir un punto en el cual existe una condicin por la cual no se requiera volver a llamar a la misma funcin.

13

Cmo funciona la recursividad?


Llamadas recursivas

Resultados de las llamadas recursivas

14

Por qu escribir programas recursivos? q p g


Son mas cercanos a la descripcin matemtica. Generalmente mas fciles de analizar Se adaptan mejor a las estructuras de datos recursivas. recursivas Los algoritmos recursivos ofrecen soluciones estructuradas modulares y estructuradas, elegantemente simples.

15

Ejercicio
Considere la siguiente ecuacin recurrente: an = an-1 + 2n a0 = 1 Escribe el algoritmo de la solucin.

16

Cundo usar recursividad?


Para simplificar el cdigo cdigo. Cuando la estructura de datos es recursiva ejemplo : rboles rboles.

Cundo no usar recursividad?


Cuando los mtodos usen arreglos largos. Cuando el mtodo cambia d manera C d l t d bi de impredecible de campos. Cuando l it C d las iteraciones sean l mejor opcin. i la j i
17

Algunas Definiciones Definiciones.

Cuando un procedimiento incluye una llamada a s mismo se conoce como recursin directa.

18

Algunas Definiciones Definiciones.

Cuando un procedimiento llama a otro procedimiento di i t y ste t causa que el l procedimiento original sea invocado, se conoce como recursin indirecta.

NOTA: NOTA: Cuando un procedimiento recursivo se llama recursivamente a si mismo varias veces, para cada llamada se crean copias independientes de las variables declaradas en el procedimiento.

19

Recursin vs iteracin vs.


Repeticin
Iteracin: ciclo explcito Recursin: repetidas invocaciones a mtodo

Terminacin
Iteracin: el ciclo termina o la condicin del ciclo falla Recursin: se reconoce el caso base
En ambos casos podemos tener ciclos infinitos Considerar que resulta ms positivo para cada problema la eleccin entre eficiencia (iteracin) o una buena ingeniera de software, La recursin resulta normalmente g , ms natural.
20

Otros Ejemplos de recursividad: Ot Ej l d i id d

Inversin de una cadena

Accion Cad-inv (Cad, limIzq, limDer) si limDer = limIzq entonces Cad-inv :=cad contrario Cad-inv := cad-inv (cad, limIzq+1,limDer) + cad-inv [limIzq] fin

21

Otros Ejemplo de recursividad: Ot Ej l d i id d


Palndromos
Un palndromo es una cadena que se lee (se escribe, escribe en este caso) igual de izquierda a derecha que de derecha a izquierda. Escribir una funcin que determine cuando una cadena es o no un palndromo.

22

Solucin
Accion palindrome (c, limIzq, limDer): booleana si limIzq > limDer entonces Palindrome:=verdadero contrario si c [li I ] = c [li D ] entonces i [limIzq] [limDer] t Palindrome:=Palindrome(c, limIzq+1, limDer-1) contrario Palindrome:= falso Palindrome: finsi Fin accion
23

Ejemplo: Serie de Fibonacci


Valores: 1, 1, 2, 3, 5, 8...
Cada trmino de la serie suma los 2 anteriores Frmula recursiva anteriores.

fib(n) = fib (n - 1) + fib (n - 2)

Caso base: Fib (0) 0; Fib (1) 1 (0)=0; (1)=1 Caso recursivo: Fib (i) = Fib (i -1) + Fib(i -2)
Accion fib(n): entero Si (n <= 1) entonces fib:=n contrario Fib:= fib(n-1)+fib(n-2); Fin accion

//condicin base //condicin recursiva

24

Ejemplo: Serie de Fibonacci


Traza del clculo recursivo
Fib(3)

Fib(2) ( ) Fib(1) 1 +

+ Fib(0) 0

Fib(1) 1

2
25

Trampas sutiles: Cdigo ineficiente ineficiente.


function fib(n: integer):integer; ( g ) g ; begin if (n < 2) then fib:= n else fib:= fib (n-2) + fib f ( n-1); ) end; Function fib(int n): integer; begin f1:= 1; f2:= 1, while (n > 2) do begin nuevo:= f1 + f2; f1:= f2; f2:= nuevo; n:= n-1 end; fib:= f2; end;
fib (100) toma tan slo unos microsegundos en dar el resultado

fib (100) toma 50 aos en dar el resultado

26

Serie fibonacci Iteracin vs recursin


70 60 50 40 30 20 10 0 0 -10
27

iteraciones recursividad i id d

10

20

30

40

50

60

Un ejemplo clsico de recursividad: Torres de Hanoi

C
28

Torres de Hanoi T d H i

Tenemos tres astas A, B y C, y un conjunto de cinco aros, todos de distintos tamaos. El enigma comienza con todos los aros colocados en el asta A de tal forma que ninguno de ellos debe estar sobre uno ms pequeo l; peq eo a l es decir estn apilados uno decir, apilados, no sobre el otro, con el ms grande hasta abajo, encima de l, el siguiente en tamao y as sucesivamente. i t

29

Torres de Hanoi

El propsito del enigma es lograr apilar los cincos aros, en el mismo orden, pero en el hasta C. Una restriccin es que durante el proceso, puedes colocar los aros en cualquier asta, pero debe apegarse a las siguientes reglas:
Solo

puede mover el aro superior de cualquiera de las astas. t Un aro ms grande nunca puede estar encima de uno ms pequeo. pequeo

30

Cmo resolvemos el problema? C l l bl ?

Para encontrar cmo se resolvera este problema, debemos ir viendo cmo se resolvera cada caso.

31

Cmo se resolvera el caso en que hubiera un aro?

Pasando directamente el aro de A a C C.


32

Cmo se resolvera el caso en que hubiera 2 aros?

Colocando el ms pequeo en el asta B, pasando el grande a el asta C y despus moviendo el que est en B a C.
33

Cmo se resolvera el caso de 3 aros?

INTENTEN

US USTEDES !! S
34

Resolviendo el problema de las Torres de Hanoi

Entonces, por lo que hemos podido ver, el programa podra definirse de la siguiente manera: Si es un solo disco, lo movemos de A a C. En otro caso, suponiendo que n es la cantidad de aros que hay que mover Movemos los n 1 aros superiores - es decir sin n-1 decir, contar el ms grande- de A a B (utilizando a C como auxiliar). Movemos el ltimo aro (el ms grande) de A a C. Movemos los aros que quedaron en B a C (utilizando a A como auxiliar). 35

Dividir para vencer Dividir vencer

Muchas veces es posible dividir un problema en subproblemas s bproblemas ms peq eos generalmente del pequeos, mismo tamao, resolver los subproblemas y entonces combinar sus soluciones para obtener la solucin del problema original. Dividir para vencer es una tcnica natural para las estructuras de datos, ya que por definicin estn compuestas por piezas. Cuando una estructura de tamao finito se divide, las ltimas piezas ya no podrn ser divididas.

36

Tarea

Funcin de Ackerman
n>= 0 m>0 m>0, n>0
37

ACK(0, n) = n+1; ACK(m, 0) = ACK(m-1, 1); ACK(m, n) = ACK(m-1, ACK(m, n-1));