Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Contenidos
1 Introducción
2 Ejemplos
3 Problemas variados
4 Problemas combinatorios
URJC DAA 2 / 52
Introducción a la recursividad Introducción
Introducción
URJC DAA 3 / 52
Introducción a la recursividad Introducción
¿Qué es la recursividad?
La mayorı́a de programadores piensa que la recursividad:
URJC DAA 4 / 52
Introducción a la recursividad Introducción
¿Qué es la recursividad?
Definición de descendientes, según el diccionario de la Real
Academia Española:
Descendientes: “hijos, nietos o personas que descienden de otra”
Es recursiva, pero no es muy clara. . .
Descender : “proceder, por natural propagación, de un mismo principio
o persona común, que es la cabeza de la familia”
No es recursiva, pero requiere saber qué significa “natural
propagación”, o “cabeza de familia”. . .
La descomposición/simplificación de problemas
El concepto de inducción
Construimos nuestra solución suponiendo que ya sabemos la
solución a problemas más simples
URJC DAA 7 / 52
Introducción a la recursividad Introducción
Descomposición/simplificación de problemas
En general, simplificar, transformar, o descomponer un problema
en otros más sencillos o de menor tamaño suele ser una buena idea
Problema Solución
Descomposición Combinación
de problemas de soluciones
p p s s
p s
p s
p s
p p s s
Resolución AUTOMÁTICA
(salvo para los casos base)
URJC DAA 8 / 52
Introducción a la recursividad Introducción
Descomposición/simplificación de problemas
URJC DAA 9 / 52
Introducción a la recursividad Introducción
Concepto de inducción
Pensemos en los pasos que tomamos para realizar una demostración
por inducción
n
X n(n + 1)
S(n) = i=
2
i=1
Concepto de inducción
Pensemos en los pasos que tomamos para implementar de manera
recursiva:
n
X
S(n) = i
i=1
URJC DAA 11 / 52
Introducción a la recursividad Introducción
URJC DAA 12 / 52
Introducción a la recursividad Introducción
6 5
5 4 4 3
4 3 3 2 3 2 2 1
3 2 2 1 2 1 1 0 2 1 1 0 1 0
2 1 1 0 1 0 1 0 1 0
1 0
URJC DAA 13 / 52
Introducción a la recursividad Introducción
URJC DAA 14 / 52
Introducción a la recursividad Introducción
Tipos de recursividad
Lineal (no final)
(
I si n = 1 1 1
f (n, A) = g (n) = f n,
A · f (n − 1, A) si n > 1 1 0 1,2
Múltiple (
1 si n = 1, 2
f (n) = g (n) = f (n)
1 + n−2
P
i=1 f (i) si n ≥ 3
Mutua
( (
1 si i = 1 0 si i = 1
B(i) = A(i) = g (n) = B(n)+A(n)
A(i − 1) si i ≥ 2 A(i − 1) + B(i − 1) si i ≥ 2
Anidada
1+y si n = 1, 2
f (n, y ) = g (n) = f (n, 0)
f (n − 1, y + f (n − 2, 0)) si n ≥ 3
URJC DAA 15 / 52
Introducción a la recursividad Ejemplos
Ejemplos
URJC DAA 16 / 52
Introducción a la recursividad Ejemplos
n
X
S(n) = i
i=1
URJC DAA 17 / 52
Introducción a la recursividad Ejemplos
URJC DAA 18 / 52
Introducción a la recursividad Ejemplos
S(n/2)
(n/2)2
S(n/2)
o
n
S(n) = 4S(n/2) − ahorras una multiplicación
2
S(n/2)
S(n/2)
S(n/2) S(n/2)
URJC DAA 19 / 52
Introducción a la recursividad Ejemplos
URJC DAA 20 / 52
Introducción a la recursividad Ejemplos
Nivel de recursividad
Apreciación subjetiva de alumnos de segundo curso de Grado en
Ingenierı́a Informática sobre su nivel de recursividad
Histograma: "Mi nivel de recursividad es excelente"
25
20
15
10
0
0 1 2 3 4 5
(1 muy en desacurdo, 5 muy de acuerdo)
URJC DAA 21 / 52
Introducción a la recursividad Ejemplos
URJC DAA 22 / 52
Introducción a la recursividad Ejemplos
Ejemplos básicos
Producto lento para números naturales
0
si b = 0
f (a, b) = a si b = 1
a + f (a, b − 1) si b ≥ 2
URJC DAA 23 / 52
Introducción a la recursividad Ejemplos
Ejemplos básicos
Factorial
(
1 si n = 0
n! =
n · (n − 1)! si n > 0
Potencia
(
n 1 si n = 0
p =
p · p n−1 si n > 0
Coeficiente Binomial
(
n 1 si (n = p) o (p = 0)
= n−1
n−1
p p + p−1 en caso contrario
Números de Fibonacci
(
1 si n = 1, 2
Fn =
Fn−1 + Fn−2 si n ≥ 3
URJC DAA 24 / 52
Introducción a la recursividad Ejemplos
Ejemplos básicos
Sumatorio general
n
(
X f (n) si n = m
g (f , m, n) = f (i) =
i=m
f (m) + g (f , m + 1, n) si m < n
Torres de Hanoi
URJC DAA 25 / 52
Introducción a la recursividad Problemas variados
Problemas Variados
URJC DAA 26 / 52
Introducción a la recursividad Problemas variados
Algoritmo de Horner
Un método famoso para la evaluación de un polinomio es el
algoritmo de Horner. Evalúa un polinomio de grado n utilizando
solamente n multiplicaciones. La clave detrás del algoritmo de Horner
es la descomposición de un polinomio p(x) de grado n de la siguiente
manera:
p(x, d) = d0 + x(d1 + x(d2 + · · · + x(dn−1 + dn x) · · · ))
p(x, d) = f (d, 0, n, x)
URJC DAA 27 / 52
Introducción a la recursividad Problemas variados
Cambio de base
14210 = 10325
Algoritmo y descomposición del problema (2810 = 1035 ):
/5 /5 /5 /5
142 28 5 1 0
%5 %5 %5 %5
2 3 0 1
(
n si n < b
f (n, b) =
n %b + 10f (n/b, b) si n ≥ b
URJC DAA 28 / 52
Introducción a la recursividad Problemas variados
Escalera de resistencias
Dos resistencias en serie
Circuitos
R1 R2 Equivalentes R1+R2
A B A B
R1 Circuitos R1·R2
Equivalentes R1+R2
A B A B
R2
Escalera de resistencias
URJC DAA 30 / 52
Introducción a la recursividad Problemas variados
Torre X
Torre Z
Torre Y
URJC DAA 31 / 52
Introducción a la recursividad Problemas variados
X X X
Z Y Z Y Z Y
X X
Z Y Z Y
URJC DAA 32 / 52
Introducción a la recursividad Problemas variados
X X X
Z Y Z Y Z Y
X X X
Z Y Z Y Z Y
Z Y
URJC DAA 33 / 52
Introducción a la recursividad Problemas variados
AntiReloj(n,X,Z,Y)
si n>0
AntiReloj(n-1,X,Z,Y)
Mueve el disco n de X a Y
Reloj(n-1,Z,X,Y)
Mueve el disco n de Y a Z
AntiReloj(n-1,X,Z,Y)
URJC DAA 34 / 52
Introducción a la recursividad Problemas combinatorios
Problemas Combinatorios
URJC DAA 35 / 52
Introducción a la recursividad Problemas combinatorios
1º
2º
Permutar n distintos: fn
nº
URJC DAA 36 / 52
Introducción a la recursividad Problemas combinatorios
(
1 si n = 1
f (n) =
n · f (n − 1) si n > 1
El caso base es trivial (para que coincida con la función factorial f (0)
debe ser interpretado como 1).
Fijando un elemento en la primera posición, habrá f (n − 1) formas de
ordenar n − 1 elementos. Como hay n formas de escoger el primer
elemento, es necesario sumar todas, por tanto: f (n) = n · f (n − 1).
Son permutaciones (factorial)
URJC DAA 37 / 52
Introducción a la recursividad Problemas combinatorios
Hojas de un árbol
Hallar cuántas hojas tiene un árbol de altura n cuyos nodos padre
siempre tienen p hijos.
Altura n p veces
1 2 p
Altura n-1
URJC DAA 38 / 52
Introducción a la recursividad Problemas combinatorios
Hojas de un árbol
(
1 si n = 0
f (p, n) =
p · f (p, n − 1) si n > 0
URJC DAA 39 / 52
Introducción a la recursividad Problemas combinatorios
Grupos de alumnos
p p p-1
+
n n-1 n-1
URJC DAA 40 / 52
Introducción a la recursividad Problemas combinatorios
Grupos de alumnos
(
1 si n = p ó p = 0
f (n, p) =
f (n − 1, p) + f (n − 1, p − 1) en caso contrario
URJC DAA 41 / 52
Introducción a la recursividad Problemas combinatorios
Subir escaleras
n-1 n-2
URJC DAA 42 / 52
Introducción a la recursividad Problemas combinatorios
Subir escaleras
1
si n = 1
f (n) = 2 si n = 2
f (n − 1) + f (n − 2) si n ≥ 3
URJC DAA 43 / 52
Introducción a la recursividad Problemas combinatorios
URJC DAA 44 / 52
Introducción a la recursividad Problemas combinatorios
2 = Conejos Adultos 0 1 1
3 1 1 2
4 1 2 3
5 2 3 5
6 3 5 8
7 5 8 13
8 8 13 21
URJC DAA 45 / 52
Introducción a la recursividad Problemas combinatorios
Modelado:
( (
1 si i = 1 0 si i = 1
Bi = Ai =
Ai−1 si i ≥ 2 Ai−1 + Bi−1 si i ≥ 2
URJC DAA 46 / 52
Introducción a la recursividad Problemas combinatorios
Contar caminos
¿Cuántos posibles caminos existen para llegar desde el origen (0,0)
hasta la coordenada (x,y), x, y ∈ N, si únicamente se pueden dar
pasos de longitud 1 hacia la derecha o hacia arriba?
(x,y)
0
si (x < 0) ó (y < 0)
fx,y = 1 si (x = 0) y (y = 0)
fx,y −1 + fx−1,y en caso contrario
(0,0)
donde n = x + y
URJC DAA 47 / 52
Introducción a la recursividad Problemas combinatorios
Configuraciones de monedas
El problema consiste en determinar el número de configuraciones de
monedas que podemos formar, en filas horizontales, de acuerdo a las
siguientes reglas:
1 Todas las monedas en una fila se están tocando (no hay huecos entre
ellas)
2 Cada moneda situada en una fila que no se la inferior, está tocando a
dos monedas por debajo de ella
La siguientes configuraciones no serı́an válidas:
URJC DAA 48 / 52
Introducción a la recursividad Problemas combinatorios
URJC DAA 50 / 52
Introducción a la recursividad Problemas combinatorios
URJC DAA 51 / 52
Introducción a la recursividad Problemas combinatorios
B(0) B(0)
B(1) B(1)
B(2) B(2)
1 si n = 0
1 si n = 1
B(n) = n−1
X
B(i) · B(n − i − 1) si n > 1
i=0
URJC DAA 52 / 52