Professional Documents
Culture Documents
1 Concepto de Recursividad
Objetivos
Denicion recursiva
1
si n = 0
n! =
n (n 1)! si n > 0
Demostracion por induccion: demostrar para un
caso base y despues para un tama
no n, considerando que esta demostrado para valores menores
que n.
Recursividad
3! = 3 * 2!
2! = 2 * 1!
(1)
(2)
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
0! = 1
(caso base)
(3)
(4)
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 1
3! = 3 * 2!
2! = 2 * 1
1! = 1 * 1 = 1
Ejemplo:
x =
n
Recursividad
1
si n = 0
n1
xx
si n > 0
(5)
(6)
3! = 3 * 2
2! = 2 * 1 = 2
3! = 3 * 2 = 6
(7)
(8)
Recursividad
El n
umero y forma de los casos base son hasta
cierto punto arbitrarios. La soluci
on sera mejor
cuanto mas simple y eciente resulte el conjunto
de casos seleccionados.
Recursividad
Recursividad
Ejemplo:
// Solucion no estructurada
int factorial (int n) {
if (n==0)
//Caso base
return 1;
else
//Caso general
return n*factorial(n-1);
}
En general, en la pila se almacena el entorno asociado a las distintas funciones que se van activando.
En particular, en un modulo recursivo, cada llamada recursiva genera una nueva zona de memoria
en la pila independiente del resto de llamadas.
Ejemplo: Ejecucion del factorial con n=3.
// Solucion estructurada
int factorial (int n) {
int resultado;
if (n==0)
//Caso base
resultado = 1;
else
//Caso general
resultado = n*factorial(n-1);
return resultado;
}
Recursividad
Recursividad
Llamada: x = factorial(3);
1
factorial
factorial
n = 2
n = 1
factorial
factorial
factorial
factorial
n = 2
n = 2
factorial
factorial
n = 3
n = 3
x=factorial(3);
x=factorial(3);
(1)
(2)
n = 3
n = 3
factorial
x=factorial(3);
x=factorial(3);
n = 0
(5)
(6)
factorial
factorial
n = 1
n = 1
factorial
factorial
factorial
n = 2
n = 2
n = 3
factorial
factorial
n = 3
n = 3
x=factorial(3);
x=factorial(3);
(3)
(4)
Recursividad
10
x=factorial(3);
x=factorial(3);
(7)
(8)
Recursividad
11
Llamada: factorial(3)
factorial(3)
n
3
factorial(2)
n
Tiempo
factorial(1)
n
1
factorial(0)
n
devuelve:
devuelve: 1*factorial(0) =
devuelve: 2*factorial(1) =
devuelve: 3*factorial(2) =
Recursividad
12
Recursividad
13
i1=((0+3)/2)+1=2,i2=3
v
v
0
1
2
3
3
7
0
1
i1
i2
(i1!=i2)
2
3
i1=0,i2=(0+3)/2=1
3
7
0
1
Recursivo(v,2,3)
v
i1
i2
(i1!=i2)
devuelve:
aux1
i1
devuelve:
Recursivo(v,0,0)
i1
i2
(i1!=i2)
Recursivo(v,2,2)
i1=0,i2=(0+1)/2=0
i1
i1=2,i2=(2+3)/2=2
Recursivo(v,0,1)
v
Recursivo(v,0,3)
i2
aux1
0
(i1=i2)
i2
(i1=i2)
(i1=i2)
i1=((2+3)/2)+1=3,i2=3
Recursivo(v,3,3)
i1=((0+1)/2)+1=1,i2=1
i1
devuelve:
i2
Recursivo(v,1,1)
v
i1
devuelve:
aux2
i2
Recursividad
aux2
(i1=i2)
aux2
aux1
14
Recursividad
15
producto(a, b) =
1. Calculo de la potencia
1
si n = 0
xn =
n1
xx
si n > 0
int potencia(int base, int expo){
if (expo==0)
return 1;
else
return base * potencia(base,expo-1);
}
2. La suma de forma recursiva
a
si b = 0
suma(a, b) =
1 + suma(a, b 1) si b > 0
0
a + producto(a, b 1)
si b = 0
si b > 0
V [0]
V [n] + sumaV (V, n 1)
si n = 0
si n > 0
16
Recursividad
17
M ayor1(V, n) =
V [0]
V [n] o M ayor1(V, n 1)
si n = 0
si n > 0
si i = d
si i < d
Recursividad
M ayor2(V, i, d) =
V [i]
=
M ayor2(V, i, (i + d)/2 o
18
Recursividad
19
7. B
usqueda lineal recursiva (con dos casos base)
BusquedaLineal(V, n, b) =
Verdad
Falso
=
(V [n] == b) o
(b {V [0], . . . , V [n 1]})
notas
si V [n] = b
si V [0] = b
en otro caso
Recursividad
20
0
1
2
3
bl (v,4,5)
v
6
5
n!=0 y v[n1]!=b
7
4
bl (v,3,5)
v
n!=0 y v[n1]!=b
bl (v,2,5)
v
Recursividad
21
bl (v,4,8)
v
6
5
7
4
n!=0 y v[n1]!=b
3.6.1
bl (v,3,8)
v
n!=0 y v[n1]!=b
Motivaci
on: La b
usqueda entre dos posiciones de
un vector ordenado se puede realizar comparando
el valor buscado con el elemento central:
bl (v,2,8)
v
n!=0 y v[n1]!=b
Si es igual, la b
usqueda termina con exito.
Si es menor, la b
usqueda debe continuar en el
subvector izquierdo.
Si es mayor, la b
usqueda debe continuar en el
subvector derecho.
bl (v,1,8)
v
n!=0 y v[n1]!=b
bl (v,0,8)
v
n=0
devuelve:
devuelve:
devuelve:
devuelve:
devuelve:
Recursividad
22
Recursividad
23
x)):
posicion t (Exito).
b) Si c < x, el elemento buscado debe estar en una posici
on mayor que t:
BUSCA (v, t+1, d,
x)
c) Si c > x, el elemento buscado debe estar en una posici
on menor que t:
BUSCA (v, i,
t-1, x)
d) Al modicar los extremos puede darse el caso
de que i > d = terminar (Fracaso).
Recursividad
24
Recursividad
25
Ejemplo: B
usqueda con exito
Recursividad
Ejemplo: B
usqueda con fracaso
26
Recursividad
27
3.6.2
Paso de par
ametros
Recursividad
28
Recursividad
29
Recursividad
Ordenaci
on r
apida
30
Recursividad
31
// Funcion de particion
int partir (int *v, int primero, int ultimo);
Ejemplo:
32
Recursividad
33
izda = primero + 1;
dcha = ultimo;
Ejemplo:
// "izda" va a la dcha.
// "dcha" va a la izda.
Recursividad
34
Recursividad
35
Recursividad
36
Recursividad
37
3.7.1
Sucesi
on de Fibonacci
F ib(0) = F ib(1) = 1
F ib(n) = F ib(n 1) + F ib(n 2)
int fibonacci (int n)
{
if (n == 0 || n == 1) return 1;
else return fibonacci(n-1) + fibonacci(n-2);
}
int fibonacci_nr (int n)
{
int ant1 = 1, ant2 = 1; // anterior y anteanterior
int actual;
// valor actual
if (n == 0 || n == 1) actual =
else
for (i=2; i<=n; i++) {
actual = ant1 + ant2; //
ant2 = ant1;
//
ant1 = actual;
//
}
return actual;
1;
Recursividad
38
Recursividad
39
3.7.2
B
usqueda binaria recursiva (2)
else {
int centro = (i+d)/2;
if (encontrado)
return 1;
return -1;
if (v[centro]==x) // Exito
return centro;
else { // Seguir buscando
if (v[centro]>x) // Buscar izda.
return BBR (v,i,centro-1,x);
else // Buscar dcha.
return BBR (v,centro+1,d,x);
}
Notas:
1. El caso base 2 (Fracaso) de la funcion BBR()
ya no es necesario porque no se debe dar el
caso de que i > d.
2. Es obligatorio que la funcion que resuelve el problema para un tama
no peque
no (BLineal())
devuelva un valor coherente con el que devuelve
BBR2().
}
}
Recursividad
40
Recursividad
41
3.7.3
Ordenaci
on r
apida (2)
// Particionar "v"
pos_pivote = partir (v, izda, dcha);
// Ordenar la primera mitad
OR2 (v, izda, pos_pivote-1);
v[pos_menor] = v[i];
v[i] = menor;
}
}
}
}
}
Recursividad
42
Recursividad
43
Recursividad
44
Recursividad
45
3.7.4
Torres de Hanoi
#include <iostream>
using namespace std;
Recursividad
46
% hanoi
Numero de discos: 3
Del poste 1 al 3
Del poste 1 al 2
Del poste 3 al 2
Del poste 1 al 3
Del poste 2 al 1
Del poste 2 al 3
Del poste 1 al 3
Recursividad
47
Recursividad
48