Anda di halaman 1dari 8

Programacin I 2010

Lenguaje de programacin C - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 1
qu es esto?
M.C. Yalu Galicia Hdez. (FCC/BUAP) 1
Unidad 5: Recursin
Recursin
M.C. Yalu Galicia Hdez. (FCC/BUAP) 2
Un rbol es una estructura recursiva
Qu ser que algo sea recursivo?
M.C. Yalu Galicia Hdez. (FCC/BUAP) 3
Por qu un rbol es una estructura recursiva?
De qu est formado un rbol?,
y cada elemento?
Como definiras recursin?
M.C. Yalu Galicia Hdez. (FCC/BUAP) 4
Esta figura es recursiva, observala bien....
Cmo las describiras?
Se repite algn patrn? Cual?
Y esta otra figura?
M.C. Yalu Galicia Hdez. (FCC/BUAP) 5
Recursin
M.C. Yalu Galicia Hdez. (FCC/BUAP) 6
Cuando algo se define en trminos de partes de s
mismo ms pequeas o mas simples, se dice que es
recursivo.
En computacin, la recursin es una tcnica
algortmica donde una funcin, para cumplir una
tarea, se llama a s misma como parte de la tarea.
Se dice que una funcin es recursiva, si la funcin
se define en trminos de si misma o se llama a s
misma directa o indirectamente.
Programacin I 2010
Lenguaje de programacin C - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 2
Funciones recursivas
M.C. Yalu Galicia Hdez. (FCC/BUAP) 7
Involucran dos partes principales o casos:
Caso base (condicin de terminacin). Es el caso en el
cual el problema es lo bastante simple para ser
resuelto directamente.
Caso recursivo. El caso recursivo tiene 3 operaciones:
Dividir el problema en una o mas partes simples o ms
pequeas del problema
Llamarse a s misma, esto es, llamar a la funcin
recursivamente en cada parte
Combinar las soluciones de las partes como una solucin para
el problema
Mtodo de las 3 preguntas
8
Utilizaremos este mtodo para verificar que una
solucin recursiva funciona. Para esto la funcin debe
ser capaz de contestar si a las siguientes tres
preguntas.
La pregunta caso-base: Hay una salida no recursiva de la
funcin y la rutina funciona correctamente para este caso
base?
La pregunta llamador-mas-pequeo: Cada llamada
recursiva se refiere a un caso ms pequeo del problema
original y tiende al caso base?
La pregunta caso-general: suponiendo que las llamadas
recursivas funcionan correctamente, funciona
correctamente toda la funcin?
Ejemplo funcin recursiva
M.C. Yalu Galicia Hdez. (FCC/BUAP) 9
Recuerdan como se define el factorial de un nmero?
n! = n*(n-1)*(n-2)*...*2*1 donde n>=0 y 0!=1
Entonces, cmo podemos definir n! en trminos de s
mismo?, es decir de otro factorial.
n! = n*(n-1)*(n-2)*...*2*1 (n-1)!
n! = n * (n-1)!
(n-1)! = (n-1) * (n-2)!
....
2! = 2*1!
1! = 1*0!
0! = 1
Ejemplo funcin recursiva
M.C. Yalu Galicia Hdez. (FCC/BUAP) 10
El factorial de un nmero ilustra muy bien los
aspectos bsicos de un problema recursivo
Se resuelve en trminos de s mismo con un valor ms
pequeo n-1 (caso recursivo)
Tiene una condicin de terminacin (caso base) en
donde se calcula directamente el resultado
0! = 1
Esto es, tiene un fin!! En algn momento termina.
Ejemplo funcin recursiva
M.C. Yalu Galicia Hdez. (FCC/BUAP) 11
#include <stdio.h>
int fact(int n)
{
if (n == 0)
return 1; //caso BASE
else
return (n*fact(n-1)); //llamada recursiva
}
int main( )
{
int n, f;
printf("Introduce un numero: ");
scanf(%d, &n);
f = fact(n);
printf("El factorial de %d es %d\n: , n,f);
}
Cmo le hace?
M.C. Yalu Galicia Hdez. (FCC/BUAP) 12
5!
5 * 4!
4 * 3!
3 * 2!
2* 1!
1 * 0!
Llamada en el
main fact(5)
1
Valor de
regreso
1
1
2
6
24
120
120 El fact(5) = 120
Programacin I 2010
Lenguaje de programacin C - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 3
Recursin v.s. iteracin
M.C. Yalu Galicia Hdez. (FCC/BUAP) 13
//funcin recursiva
int fact(int n) {
if(n==0|| n== 1)
return 1;
return (n*fact(n-1));
}
// funcin iterativa
int fact(int n) {
int f=1;
if(n==0|| n== 1)
return 1;
else {
for(int i=1;i<=n; i++)
f *= i;
return f;
}
}
No cliclos
Uso de cliclos
Pila de recursin
M.C. Yalu Galicia Hdez. (FCC/BUAP) 14
Cdigo
Datos
Extra ( o
libre)
Stack (pila)
Sistema
Segmentos o
reas de Memoria
El rea de stack est destinado
a almacenar las variables
locales, los parmetros de la
funcin que se est ejecutando
y su valor de regreso
int suma(int x, int y) {
int z;
z = x +y;
return z;
}
Llamada a una funcin iterativa
M.C. Yalu Galicia Hdez. (FCC/BUAP) 15
i = 1
f = 1
n=3
Regreso fact(3)
// funcin iterativa
int fact(int n) {
int f=1;
if(n==0|| n== 1)
return 1;
for(int i=1;i<=n; i++)
f *= i;
return f;
}
int main() {
int f;
f = fact(3);
}
Stack
Ejemplo llamada recursiva
M.C. Yalu Galicia Hdez. (FCC/BUAP) 16
//funcin recursiva
int fact(int n) {
if(n==0)
return 1;
return (n*fact(n-1));
}
int main() {
int f;
f = fact(3);
}
n = 0
Regreso 1 *fact(0)
n = 1
Regreso 2 *fact(1)
n = 2
Regreso 3 *fact(2)
n = 3
Regreso fact(3)
Recursividad v.s. Iteracin
M.C. Yalu Galicia Hdez. (FCC/BUAP) 17
Recursividad Iteracin
Eficiencia en
espacio
Puede requerir gastos considerables,
sobre todo en almacenamiento, ya
que debe guardar copias de
variables locales
Ms eficiente
Eficiencia en
tiempo
El tiempo de una llamada es costosa Los ciclos son directos
Capacidad de
computadora
Algunos valores son calculados una y
otra vez excediendo la capacidad de
la computadora antes de obtener
una respuesta
La eficiencia en tiempo y
espacio permiten llegar en
algunos casos a soluciones
Claridad en la
solucin
En algunos casos la solucin
recursiva es ms simple, fcil y
natural. Utiliza menos cdigo
Mayor cdigo y ms
variables lo hacen mas
complicado
Otro ejemplo
M.C. Yalu Galicia Hdez. (FCC/BUAP) 18
Hacer un mtodo recursivo que sume los n primeros
nmeros enteros positivos. Esto es:
Para n= 5, S(5) = 1 + 2+ 3+ 4+5
Como punto de partida se puede afirmar que para:
n=1, la suma S(1) = 1
n=2, la suma S(2) = S(1) + 2
n=3, la suma S(3) = S(2)+3

Para n , la suma S(n) = S(n-1) + n
Visto as, la funcin suma se est definiendo en
trminos de s misma
Programacin I 2010
Lenguaje de programacin C - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 4
SOLUCION
int S(int n)
{
if(n==1) //caso base
return 1;
else
return n + S(n-1) ; //caso recursivo
}
M.C. Yalu Galicia Hdez. (FCC/BUAP) 19
En general se puede definir la solucin as:
S(n) = 1 n = 1
n + S(n-1) n >1
Actividad Colaborativa
M.C. Yalu Galicia Hdez. (FCC/BUAP) 20
En binas hacer un programa que lea un nmero N y llame a
las funciones recursivas imprime(n) e imprimeAlReves(n),
que imprimen los nmeros desde N hasta 0 y de 0 hasta N
respectivamente. No usar estructuras de repeticin.
void imprime(int n);
void imprimeAlReves(int n) ;
int main() {
int n;
println(ingresa un nmero: );
scanf(%d, &n);
println(Los nmeros de %d a 0 son: \n, n);
imprime(n);
imprimeAlReves(n);
}
Actividad Colaborativa
M.C. Yalu Galicia Hdez. (FCC/BUAP) 21
En binas hacer un programa que resuelva el problema del mximo
comn divisor (MCD) de dos nmeros X y Y.
El MCD, es el mayor entero que divide tanto a X como a Y.
Escribir una funcin recursiva que calcule el MCD
Una versin para resolver este problema del MCD es el famoso
algoritmo de Euclides, una versin de este algoritmo es la
siguiente:
Sean m,n +
Paso 1: Dividir m por n y obtener residuo r ( 0 <= r <= n)
Paso 2: si r = 0, entonces la respuesta es n y el algoritmo termina
Paso 3: caso contrario asignar m n y n r volver al paso 1
Por ejemplo, si m=42 y n=30 entonces el mcd(42,30) = 6
Que aprendimos?
M.C. Yalu Galicia Hdez. (FCC/BUAP) 22
Tipos de recursin
M.C. Yalu Galicia Hdez. (FCC/BUAP) 23
Existen 4 tipos de recursin que dependen del
nmero de llamadas a s misma y el lugar de la
llamada.
Recursin simple: Aquella en cuya definicin slo
aparece una llamada recursiva
Ejemplo: Funcin Factorial, imprime, MCD, etc.
Recursin mltiple: Se d cuando hay ms de una
llamada a s misma dentro del cuerpo de la funcin
Ejemplos: Funcin Fibonacci, torres de hanoi, escape del
calabozo, etc.
Tipos de recursin
M.C. Yalu Galicia Hdez. (FCC/BUAP) 24
Recursin anidada: Aquella en que en algunos de los
argumentos de la llamada recursiva hay una nueva
llamada a si misma.
Ejemplo: Funcin de Ackerman
Recursin cruzada o indirecta: son algoritmos donde
una funcin provoca una llamada a s misma de forma
indirecta a travs de otras funciones. Es decir, es
aquella en la que una funcin llama a otra funcin y
esta a su vez llama a la funcin que la llamo.
Ejemplos: Funcin par-impar, juego de las piedras
Programacin I 2010
Lenguaje de programacin C - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 5
Recursin Mltiple
M.C. Yalu Galicia Hdez. (FCC/BUAP) 25
Cierto matemtico italiano de nombre Leonardo de Pisa, pero
mejor conocido como Fibonacci, propuso el siguiente
problema:
Supon que acabamos de comprar una pareja de conejos adultos.
Al cabo de un mes, esa pareja tiene una pareja de conejitos (un
conejo y una coneja). Un mes despus, nuestra primera
pareja tiene otra pareja de conejitos (nuevamente, un conejo y
una coneja) y, al mismo tiempo, sus primeros hijos se han vuelto
adultos. As que cada mes que pasa, cada pareja de conejos
adultos tiene una pareja de conejitos, y cada pareja de conejos
nacida el mes anterior se vuelve adulta. La pregunta es, cuntas
parejas de conejos adultos habr al cabo de n meses? Para
resolver este problema, llamemos Fn al nmero de parejas
adultas al cabo de n meses.
La sucesin de nmeros F0 = 1, F1 = 1, F2 = 2, F3 = 3, F4 = 5,
etc. recibe el nombre de sucesin de Fibonacci
Recursin Mltiple
M.C. Yalu Galicia Hdez. (FCC/BUAP) 26
La serie de Fibonacci puede definirse como:
Fn = Fn-1 + Fn-2 para n >= 2, F0 = F1 = 1
Esto define la sucesin
1, 1, 2 , 3, 5, 8, 13, 21, 34, 55, ...
Cmo se define recursivamente?
int Fib(int n) {
if (n == 0 || n == 1) //caso base
return 1;
return Fib(n-1) + Fib(n-2); //lamada recursiva
}
Recursin anidada
M.C. Yalu Galicia Hdez. (FCC/BUAP) 27
Funcin de Ackerman A se define para valores no
negativos M y N del siguiente modo:
A(0, n) = n + 1
A(m, 0) = A (m-1, 1) m > 0
A(m, n) = A (m-1, A(m, n-1)) n,m > 0
Recursin anidada
M.C. Yalu Galicia Hdez. (FCC/BUAP) 28
Funcin de Ackerman
int Ack (int m, int n) {
if (m == 0)
return n+1;
else
if (n == 0)
return Ack(m-1, 1);
else
return Ack(m-1, Ack(m, n-1)); //anidada
}
cul es el valor de Ackerman si m=1 y n = 2?
Recursin cruzada o indirecta
M.C. Yalu Galicia Hdez. (FCC/BUAP) 29
Funcin par-impar
int main( ) {
int x;
println(Introduce un nmero: );
scanf(%d, &x);
if (par(x) == 1)
println( %d es par \n, x);
else
println( %d no es par\n, x);
}
Recursin cruzada o indirecta
M.C. Yalu Galicia Hdez. (FCC/BUAP) 30
int par(int n) {
if ( n== 0)
return 1;
else
return impar(n-1);
}
int impar(int n) {
if ( n== 0)
return 0;
else
return par(n-1);
}
Programacin I 2010
Lenguaje de programacin C - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 6
M.C. Yalu Galicia Hdez. (FCC/BUAP) 31
Actividad colaborativa
En ternas para resolver el siguiente problema usando
recursin indirecta.
El problema se llama el juego de las piedras.
El juego inicia con 21 piedras.
Dos jugadores se turnan para tomar las piedras.
Cada uno debe tomar al menos 1 piedra y mximo 4
piedras en cada turno.
El jugador que toma la ultima piedra es el perdedor.
Indicar en cada turno a que jugador le toca retirar las
piedras y al final quien es el jugador GANADOR.
Actividad colaborativa
M.C. Yalu Galicia Hdez. (FCC/BUAP) 32
"Un genetista acaba de fabricar un extrao tipo de
bacteria, que se reproduce una nica vez en su vida a los
tres segundos de ser fabricada, generando tres bacterias
"hijas". Tres segundos mas tarde, cada bacteria hija se
reproducir, generando tres nuevas bacterias, y as
sucesivamente.
En ternas escriban un mtodo recursivo MULTIPLE
CultivoDeBacterias, que dada una cantidad de tiempo T,
expresada en segundos, devuelva cuntas bacterias en
total se generarn en esos T segundos a partir de una
bacteria inicial
Por ejemplo: para un Tiempo = 7 segs. se generarn 12
bacterias a partir de la bacteria original
Actividad grupal (SOLUCION)
M.C. Yalu Galicia Hdez. (FCC/BUAP) 33
Compartiendo la experiencia
M.C. Yalu Galicia Hdez. (FCC/BUAP) 34
Las torres de Hanoi
Torres de Hanoi
M.C. Yalu Galicia Hdez. (FCC/BUAP) 35
La leyenda cuenta que en un templo del lejano
oriente, los sacerdotes intentaban mover una pila
de discos de una estaca a otra.
La pila inicial tena 64 discos ensartados en una
estaca, y estaban acomodados de abajo hacia arriba
en orden de tamao decreciente.
Torres de Hanoi
M.C. Yalu Galicia Hdez. (FCC/BUAP) 36
Los sacerdotes intentan mover la pila de discos de
una estaca hacia una segunda estaca, con las
restricciones de:
Mover un solo disco a la vez
Ningn disco ms grande debe colocarse encima de
uno ms pequeo
Una tercera estaca est disonible para alojar
temporalmente a los discos
Programacin I 2010
Lenguaje de programacin C - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 7
Torres de Hanoi
M.C. Yalu Galicia Hdez. (FCC/BUAP) 37
Se supone que, el mundo se arreglar cuando los
sacedortes completen su tarea.
Por lo cual tenemos grandes insentivos para
ayudarles a solucionar el problema
Supongamos que los sacerdotes intentan mover los
discos de la estaca 1 a la 3.
Torres de Hanoi
38
Ejemplo con 3 estacas y 4 discos
1 2 3
M.C. Yalu Galicia Hdez. (FCC/BUAP) 39
Actividad en equipos
Desarrollar un algoritmo que obtenga la
secuencia precisa de movimientos, para la
transferencia de todos los discos de una
estaca a otra.
M.C. Yalu Galicia Hdez. (FCC/BUAP) 40
Actividad en equipos
Si atacamos el problema con recursividad, mover n
discos puede considerarse en trminos de mover slo
n-1 discos, de la siguiente forma:
Mover n-1 discos de la estaca 1 a la 2, utilizando
la estaca 3 como rea de almacenamiento
temporal
Mover el ltimo disco (el ms grande) de la estaca
1 a la 3
Mover los n-1 discos de la estaca 2 a la 3,
utilizando la 1 como rea de almacenamiento
temporal
M.C. Yalu Galicia Hdez. (FCC/BUAP) 41
Actividad en equipos
El proceso termina cuando la ltima tarea
involucra mover el disco n=1, es decir, el
caso base.
Esto se logra moviendo trivialmente el disco,
sin necesidad alguna de rea de
almacenamiento temporal.
M.C. Yalu Galicia Hdez. (FCC/BUAP) 42
Actividad en equipos
Escribir un programa que resuelva el problema de
las torres de Hanoi.
Utilizar una funcin recursiva con cuatro
parmetros:
El nmero de discos a mover
La estaca en la que inicialmente estn
ensartados los discos
La estaca a la que la pila de discos se mover
La estaca que se utilizar como rea de
almacenamiento temporal
Programacin I 2010
Lenguaje de programacin C - 10
M.C. Yalu Galicia Hdez. (FCC/BUAP) 8
M.C. Yalu Galicia Hdez. (FCC/BUAP) 43
Actividad en equipos
El programa deber desplegar las instrucciones precisas que
seguir para mover una pila de discos desde la estaca inicial
hasta la estaca de destino.
Ejemplo:
Para mover una pila de tres discos de la estaca 1 a la 3, el
programa deber desplegar la siguiente serie de
movimientos:
1->3
1->2
3->2
1->3
2->1
2->3
1->3
44
Actividad Colaborativa
Actividad Reaccin en cadena
En un laboratorio de minerales se estn realizando
experimentos para predecir las reacciones en cadena que
se puede dar al hacer explotar una roca de tamao N,
con una bomba de capacidad B.
El experimento es el siguiente: dados 2 nmeros N y B,
tal que B < N, cuando N explota se parte en dos
nmeros N1 = N / B y N2 = N ( N / B).
B produce una reaccin en cadena si N1 o N2 son
mayores que B. Esto es, si los pedazos resultantes son
mayores que la bomba estos tambin explotan
partindose nuevamente en dos pedazos, segn el
criterio anterior.
Este proceso se repite hasta que todos los pedazos
resultantes (N1 y N2) sean menores o iguales a B.
M.C. Yalu Galicia Hdez. (FCC/BUAP) 45
Reaccin en cadena
Ejemplo:
Supongamos que N = 10 y la bomba B = 3.
Al aplicar la bomba B, N se parte inicialmente en dos
pedazos N1 = 10/3 = 3 y N2 = 10-10/3= 7.
Como N2=7 es mayor que la bomba, se produce la
reaccin en cadena, y N2 tambin estalla en dos
pedazos: 7/3 = 2 y 7-(7/3) = 5.
Nuevamente el segundo pedazo es mayor que la
bomba por lo que tambin deber estallar en dos
pedazos: 5/3 y 5-(5/3).
El proceso se repite hasta que todos los pedazos sean
menores o iguales a 3 (la bomba).
Al final, el bloque N=10, con la bomba igual a 3,
habr estallado en los pedazos: 3, 2, 1,1 y 3.
M.C. Yalu Galicia Hdez. (FCC/BUAP) 46
Reaccin en cadena
Escribir una funcin recursiva, que
dado una roca de tamao N y una
bomba de capacidad B, obtenga la
reaccin en cadena que resulta de
explotar la roca con la bomba dada.
La funcin debe imprimir todos los
pedazos que resultan al explotar N
usando B.
Actividad grupal (SOLUCION)
M.C. Yalu Galicia Hdez. (FCC/BUAP) 47
Compartiendo la experiencia
Qu hemos aprendido?
M.C. Yalu Galicia Hdez. (FCC/BUAP) 48

Anda mungkin juga menyukai