Sei sulla pagina 1di 43

MATEMÁTICAS DISCRETAS

Marco E. Benalcázar, Ph.D.

9 de julio de 2016
RELACIONES DE
RECURRENCIA
Relaciones de Recurrencia y Algoritmos
Recursivos: Definiciones
Relación de recurrencia: Una relación de recurrencia para la sucesión a0, a1, ... es una
ecuación que relaciona an con ciertos predecesores a0, a1,..., an−1. Las condiciones iniciales
para una sucesión a0, a1, ... son valores dados en forma explícita para un número finito de
términos de la sucesión.

Función recursiva: es un programa (o seudocódigo) que se invoca a sí mismo.

Casos base: Valores para los que una función recursiva no se invoca a sí misma.

Algoritmo recursivo: es un algoritmo que contiene una función recursiva.

La recursividad es una forma poderosa, elegante y natural de resolver una clase amplia
de problemas. Un problema que involucra un algoritmo recursivo se resuelve mediante una
técnica de divide y vencerás.

Divide y vencerás: bajo esta técnica, un problema se descompone en problemas del mismo
tipo que el problema original. Cada subproblema, a su vez, se descompone aún más hasta
que el proceso produce subproblemas que se pueden resolver de manera directa. Por
último, las soluciones de los subproblemas se combinan para obtener una solución del
problema original.
Link: https://www.youtube.com/watch?v=Mv9NEXX1VHc
Relaciones de Recurrencia y Algoritmos
Recursivos: Ejemplos (1)
Ejemplo 1: Algoritmo recursivo para el cálculo del factorial de n.

El algoritmo recursivo para calcular el factorial de n se basa en la siguiente


ecuación:
n! = n*(n - 1)!, donde el caso base es 0! = 1
.

Función recursiva para el cálculo


del factorial de n

DEMO en Matlab: Comparación del tiempo (TiempoPromedioFactorial.m) de


ejecución entre la versión recursiva (Factorial_Recursivo.m) y la versión no
recursiva o iterativa (Factorial_NoRecursivo.m) para el cálculo del factorial.
Relaciones de Recurrencia y Algoritmos
Recursivos: Ejemplos (2)
Ejemplo 2: Un robot puede dar pasos de 1 o 2 metros. Sea un algoritmo para
calcular el número de maneras que el robot puede caminar n metros.

Sea walk(n) el número de maneras en que el robot puede caminar n metros. De


los datos de la tabla anterior se tiene que:

walk(1) = 1 y walk(2) = 2 (casos base)

Para n > 2, se obtiene la siguiente ecuación:

walk(n) = walk(n − 1) + walk(n − 2).


Relaciones de Recurrencia y Algoritmos
Recursivos: Ejemplos (3)

Función recursiva para el cálculo


del número de maneras en que
un robot puede caminar una
distancia de n metros
Sucesión de Fibonacci (1)
La sucesión walk(1), walk(2), ..., cuyos valores comienzan con 1, 2, 3, 5, 8, 13, …,
está relacionada con la sucesión de Fibonacci.
Sucesión de Fibonacci: La sucesión o serie de Fibonacci {fn } está definida por
las siguientes ecuaciones:
Número de oro
1 para n = 1

fn = 1 para n = 2

fn − 1 + fn − 2 para toda n ≥ 3
Número de espirales

Calcule fn/fn-1

Número de pétalos y sépalos


Links: http://www.maths.surrey.ac.uk/hosted-sites/R.Knott/Fibonacci/fibnat.html
http://www.sciencedirect.com.sci-hub.io/science/article/pii/S0363502302055065
Sucesión de Fibonacci (2)
Imaginemos que una pareja de conejos tarda un mes en alcanzar la edad fértil. A partir de ese momento cada
vez engendra otra pareja de conejos, que a su vez (tras llegar a la edad de fertilidad) engendrarán cada mes
una pareja de conejos. ¿Cuántos pares de conejos habrá al cabo de un determinado número de meses?

Nota: se asume que los conejos no mueren y que engendran cada vez un solo par de conejos.
Sucesión de Fibonacci (3)

Rectángulo de oro Espiral de oro

Links: http://www.popmath.org.uk/rpamaths/rpampages/snail.html
http://jwilson.coe.uga.edu/emt668/EMAT6680.2000/Obara/Emat6690/Golden%20Ratio/golden.html
Sucesión de Fibonacci (4)
Torre de Hanoi

Reglas para jugar la torre de Hanoi:

 La Torre de Hanoi es un juego que consiste en tres estacas montadas en una


tabla y n discos de varios tamaños con agujeros en sus centros.

 Se supone que si un disco está en una estaca, sólo un disco de diámetro más
pequeño se puede colocar encima de él.

 Si se tienen todos los discos apilados en una estaca, el problema es


transferir todos los discos a otra estaca moviendo sólo un disco a la vez.
Link:http://britton.disted.camosun.bc.ca/hanoi.swf
Algoritmo Recursivo para Resolver la Torre
de Hanoi

Demo en Matlab: SolveHanoiTower.p

El número de movimientos que se requiere para resolver el juego de Hanoi de n


discos es: cn = 2*cn−1 + 1, con n > 1.

Torre de Hanoi con 6 discos: https://www.youtube.com/watch?v=82FCBJIAtP0


Optimalidad de la Solución de la Torre de
Hanoi
Función de Ackermann
A diferencia de algunas funciones recursivas (por ejemplo el factorial), la función de Ackermann no
puede calcularse de manera iterativa.

Sean m,n  , la función de Ackermann se define de la siguiente forma:

Links: https://en.wikipedia.org/wiki/Ackermann_function DEMO: TestAckermanFunction.m


https://www.youtube.com/watch?v=i7sm9dzFtEI
SOLUCIÓN DE
RELACIONES DE
RECURRENCIA
Solución de Relaciones de Recurrencia:
Método de Iteraciones
Procedimiento:

 Para resolver una relación de recurrencia que implica la sucesión a0, a1, ... por
iteración, se usa la relación de recurrencia para escribir el n-ésimo término an
en términos de algunos de sus predecesores an−1, ... , a0.

 Después se usa la relación de recurrencia de manera sucesiva para sustituir


cada uno de an−1, ... por algunos de sus predecesores.

 El proceso continúa de manera iterativa hasta obtener una fórmula explícita.


Método de Iteraciones: Ejemplo (1)

Encontrar una fórmula explicita


para la relación de recurrencia
que describe la complejidad
temporal del programa recursivo
que calcula el factorial de n:

f(n) = f(n -1) + 1 +1 +1

if resta multiplicación

f(0) = 1
Método de Iteraciones: Ejemplo (2)
Método de Iteraciones: Ejemplo (3)
Relaciones de Recurrencia Homogéneas Lineales con
Coeficientes Constantes
Una relación de recurrencia homogénea lineal de orden k con coeficientes constantes es
una relación de recurrencia de la forma:
an = c1an−1 + c2an−2 + ··· + ckan−k , ck  0.

Una relación de recurrencia homogénea lineal de orden k con coeficientes constantes junto
con k condiciones iniciales

a0 = C0, a1 = C1, . . . , ak−1 = Ck−1,

define de manera única una sucesión a0, a1, ....

Ejemplo 3: Las siguientes son relaciones de recurrencia homogéneas lineales con


coeficientes constantes:
 Sn = 2Sn−1
 fn = fn−1 + fn−2

Ejemplo 4: Las siguientes son relaciones de recurrencia NO homogéneas lineales con


coeficientes constantes:
 an − an−1 = 2n (La expresión del lado derecho de la ecuación no es cero. Ecuación no homogénea).
 an = 3nan−1 (el coeficiente 3n no es constante).
 an = 3an−1an−2 (los términos como an−1an−2 no se permiten).
Solución de Relaciones de Recurrencia Homogéneas
Lineales con Coeficientes Constantes

Teorema 1: Sea

an = c1an−1 + c2an−2

una recurrencia homogénea lineal de segundo orden. Sea también la ecuación


cuadrática

t2 – c1t – c2 = 0

Si las raíces de esta ecuación cuadrática r1 y r2 son diferentes, r1  r2 , entonces


la solución explícita de esta relación de recurrencia está dada por la función

an = b*(r1)n + d*(r2)n

donde b y d son constantes. El valor de estos coeficientes se obtiene como


solución del sistema de ecuaciones de 2 variables y 2 incógnitas que resulta de las
2 condiciones iniciales de la relación de recurrencia en cuestión.
Solución de Relaciones de Recurrencia Homogéneas
Lineales con Coeficientes Constantes: Ejemplo 1
Ejemplo 5: Encuentre una fórmula explícita para la sucesión definida por la relación de
recurrencia an = 5an−1 − 6an−2 y las siguientes condiciones iniciales a0 = 7 y a1 = 16.

Para la resolución de este ejercicio se debe encontrar las raíces de la siguiente ecuación cuadrática

t2 – c1t – c2 = 0

donde c1 = 5 y c2 = -6, con lo cual obtenemos

t2 – 5t – (-6) = t2 – 5t + 6 = 0

Al resolver esta ecuación se obtienen las raíces r1 = 2 y r2 = 3. En función de esto, la solución de la


relación de recurrencia en cuestión tiene la forma

an = b*(r1)n + d*(r2)n = b*2n + d*3n

Para encontrar el valor de b y d se resuelve el siguiente sistema de ecuaciones:

a0 = b*20 + d*30 = 7 = b + d
a1 = b*21 + d*31 = 16 = 2*b + 3*d

De lo anterior se obtiene b = 5 y d = 2. Finalmente, la fórmula explícita para la relación de recurrencia de


este ejercicio es

an = 5*2n + 2*3n
Solución de Relaciones de Recurrencia Homogéneas
Lineales con Coeficientes Constantes: Ejemplo 2
Ejemplo 6: Encuentre una fórmula explícita para la sucesión definida por la relación de
recurrencia dn = 3dn−1 − 2dn−2 y las siguientes condiciones iniciales d1 = 200 y d2 = 220.
Solución de Relaciones de Recurrencia Homogéneas
Lineales con Coeficientes Constantes: Ejemplo 3 (1)
Ejemplo 7: Encuentre una fórmula explícita para la sucesión de Fibonacci.

Continúa en la siguiente filmina


Solución de Relaciones de Recurrencia Homogéneas
Lineales con Coeficientes Constantes: Ejemplo 3 (2)
Solución de Relaciones de Recurrencia Homogéneas
Lineales con Coeficientes Constantes

Teorema 2: Sea

an = c1an−1 + c2an−2

una recurrencia homogénea lineal de segundo orden. Sea también la ecuación


cuadrática

t2 – c1t – c2 = 0

Si las raíces de esta ecuación cuadrática r1 y r2 son iguales, r1 = r2 , entonces la


solución explícita de esta relación de recurrencia está dada por la función

an = b*(r1)n + d*n*(r2)n

donde b y d son constantes. El valor de estos coeficientes se obtiene como


solución del sistema de ecuaciones de 2 variables y 2 incógnitas que resulta de las
2 condiciones iniciales de la relación de recurrencia en cuestión.
Solución de Relaciones de Recurrencia Homogéneas
Lineales con Coeficientes Constantes: Ejemplo 1
Ejemplo 8: Encuentre una fórmula explícita para la relación de recurrencia an = 4(an−1 − an−2)
sujeta a las siguientes condiciones iniciales a0 = a1 = 1.

Para la resolución de este ejercicio se debe encontrar las raíces de la siguiente ecuación cuadrática

t2 – c1t – c2 = 0

donde c1 = 4 y c2 = -4, con lo cual obtenemos

t2 – 4t – (-4) = t2 – 4t + 4 = 0

Al resolver esta ecuación se obtienen las raíces r1 = r2 = 2. En función de esto, la solución de la relación de
recurrencia en cuestión tiene la forma

an = b*(r1)n + d*n*(r2)n = b*2n + d*n*2n

Para encontrar el valor de b y d se resuelve el siguiente sistema de ecuaciones:

a0 = b*20 + d*0*20 = 1 = b
a1 = b*21 + d*1*21 = 1 = 2*b + 2*d

De lo anterior se obtiene b = 1 y d = -1/2. Finalmente, la fórmula explícita para la relación de recurrencia


de este ejercicio es

an = 1*2n – (1/2)*n*2n = 2n – n*2n - 1


Solución de Relaciones de Recurrencia:
Árboles de Recurrencia (1)
 Los árboles de recurrencia permiten resolver relaciones de recurrencia de la
forma
T(n) = a*T(n/b) + f(n),

donde a y b son números naturales. Este tipo de relaciones se obtienen


típicamente cuando se analizan algoritmos recursivos basados en la estrategia de
“divide y vencerás”.

 Las hojas del árbol son los casos base de la recursión.

casos base

 Si la relación recursiva T(n) caracteriza la complejidad temporal de un algoritmo


recursivo, entonces este algoritmo para resolver un problema de tamaño n divide
dicho problema en a sub-problemas, cada uno de tamaño n/b, y luego realiza f(n)
unidades de trabajo adicional.
Solución de Relaciones de Recurrencia:
Árboles de Recurrencia (2)
Consideremos la relación de recurrencia T(n) = a*T(n/b) + c*nk, con T(1) = k. El grado de
ramificación del árbol de recurrencia de esta relación es a. La profundidad, o número de
niveles, de este árbol es logb(n)
Tamaño del problema Árbol de recurrencia Cantidad de Trabajo

n c*nk

n/b a*c*(n/b)k

logb(n) n/b2 a2*c*(n/b2)k

Para calcular el resultado de la recurrencia, simplemente se suman los valores de la columna


cantidad de trabajo:
Solución de Relaciones de Recurrencia:
Árboles de Recurrencia (2)
Ejemplo 9: Construir el árbol de recurrencia para la relación T(n) = 2*T(n/2) + n, con T(1) = 1.
En base a este árbol encontrar una función explícita para T(n). Asuma que n es una potencia
de 2.

A continuación se presenta un árbol con los primeros 4 niveles para la relación T(n). Note que este gráfico
está compuesto por 3 columnas. La primera describe el tamaño de los subproblemas de cada nivel, la
segunda muestra el árbol de recurrencia y la tercera muestra la cantidad de trabajo que se ejecuta en
cada nivel.

Tamaño del problema Árbol de recurrencia Cantidad de Trabajo


Solución de Relaciones de Recurrencia:
Árboles de Recurrencia (3)
El árbol completo para la relación de recurrencia T(n) se muestra en la siguiente figura:
Tamaño del problema Árbol de recurrencia Cantidad de Trabajo

Dado que n es potencia de 2, entonces la cantidad de niveles del árbol anterior está dada por
log2(n) + 1. Dado que en cada nivel se realiza una cantidad de trabajo n, entonces la cantidad
total de trabajo que se realiza es T(n) = n*(log2(n) + 1).
ANÁLISIS
ASINTÓTICO DE
RELACIONES DE
RECURRENCIA
Análisis Asintótico de Relaciones de Recurrencia
Caso 1: Análisis asintótico de relaciones de recurrencia homogénea lineal. En este
caso primero se encuentra una solución explícita f(n) para la relación de
recurrencia y luego se encuentran las funciones O,  y  de f(n).

Caso 2: Análisis asintótico de relaciones de recurrencia de la forma

T(n) = a*T(n/b) + c*f(n),

donde f(n) es una función asintóticamente positiva, a  1 y b  2 son números


naturales y c es una constante.
En este caso aplicamos el teorema maestro.
Teorema maestro:

1 Típicamente, para el segundo caso k = 0.


Análisis Asintótico de Relaciones de Recurrencia:
Ejemplo 1
Ejemplo 10: Calcule la notación  de la relación de recurrencia T(n) = 16*T(n/4) + n

Para esta relación de recurrencia se tiene que f(n) = n, a = 16, b = 4 y c = 1. Adicionalmente, se


puede verificar que f(n) = O(n), f(n) = (n) y f(n) = (n).

Caso 1: Calculando el resultado de logb(a) -  = 1 = log4(16) -  se tiene que  = 1  0. Por lo


tanto se cumple el primer caso del teorema maestro, con lo cual T(n) = ( nx ), donde
x = log4(16) = 2. Entonces se tiene que T(n) = ( n2 ).
Análisis Asintótico de Relaciones de Recurrencia:
Ejemplo 2
Ejemplo 11: Calcule la notación  de la relación de recurrencia T(n) = 3*T(n/3) + n/2

Para esta relación de recurrencia se tiene que f(n) = n/2, a = b = 3 y c = 1/2. Adicionalmente,
se puede verificar que f(n) = O(n), f(n) = (n) y f(n) = (n).

Caso 1: Calculando el resultado de logb(a)-  = 1 = log3(3) -  se tiene que  = 0. Por lo tanto no se


cumple el primer caso del teorema maestro.

Caso 2: Para este caso se tiene que k = 0 dado que f(n) no tiene ningún logaritmo. El resultado
de logb(a) = log3(3) = 1. Por lo tanto se cumple el segundo caso del teorema maestro, con lo cual
T(n) = ( nx * [log2(n)]k + 1), donde x = log3(3) = 1. Entonces se tiene T(n) = ( n1 * log2(n)]0 + 1 ) =
( n*log2(n) ).
Análisis Asintótico de Relaciones de Recurrencia:
Ejemplo 3
Ejemplo 12: Calcule la notación  de la relación de recurrencia T(n) = 3*T(n/2)+ n2
Para esta relación de recurrencia se tiene que f(n) = n2, a = 3, b = 2 y c = 1. Adicionalmente, se
puede verificar que f(n) = O(n2), f(n) = (n2) y f(n) = (n2).

Caso 1: Calculando el resultado de logb(a) -  = 2 = log2(3) -  se tiene que  = -0.415  0. Por lo


tanto no se cumple el primer caso del teorema maestro.

Caso 2: Para este caso se tiene que k = 0 dado que f(n) no tiene ningún logaritmo. El resultado
de logb(a) = log2(3) = 1.585  2. Por lo tanto no se cumple el segundo caso del teorema maestro.

Caso 3: Calculando el resultado de logb(a) +  = 2 = log2(3) +  se tiene que  = 0.415  0. Ahora


verificamos la condición de regularidad a*f(n/b)  c*f(n), lo cual implica demostrar que se
cumple la desigualdad 3*f(n/2)  1*f(n)

3*(n/2)2  n2
(3/4)* n2  n2

Dado que 3/4  1, entonces la última desigualdad es verdadera. Por lo tanto se cumple el
tercer caso del teorema maestro con lo cual T(n) = ( f(n) ) = (n2).
DEBER
Ejercicios (1)

Resolver los siguientes ejercicios:

Los siguientes ejercicios se refieren a la serie de Fibonacci:


Ejercicios (2)
Ejercicios (3)

Encuentre una fórmula explícita para las siguientes relaciones de recurrencia:


Ejercicios (4)
Usando un árbol de recurrencias, encuentre una fórmula explícita para la siguiente relación
de recurrencia. Asuma que n es potencia de 3.

R: T(n) = n*(log3(n) + 1)
Ejercicios (5)
Usando el teorema maestro, encontrar la notación  de las siguientes relaciones
de recurrencia:

1) T(n) = 6*T(n/3)+ n2 * log2(n) R: T(n) = ( n2 *log2(n) ) (Caso 3)

2) T(n) = 2*T(n/2) + n*log2(n) R: T(n) = ( n*log2(n) ) (Caso 2)

3) T(n) = sqrt(2)*T (n/2) + log2(n) R: T(n) = ( sqrt(n) ) (Caso 1)

sqrt (x) = raíz cuadrada de x.


HASTA LA
PRÓXIMA
CLASE

Potrebbero piacerti anche