Documentos de Académico
Documentos de Profesional
Documentos de Cultura
HUANCAYO - 2022
UNIDAD II COLAS Y RECURSIVIDAD
TEMA: Recursividad
=
Prob(n) Soluc(n)
Reducción Combinación
Prob(n-a)
Prob(n-a) = Soluc(n-a)
Soluc(n-a)
• 1! = 1
• 2! = 2 2*1
• 3! = 6 3*2*1
• 4! = 24 4*3*2*1
• 5! = 120 5*4*3*2*1
Ejemplo función recursiva
Recordemos como se define el factorial de un número?
n! = n*(n-1)*(n-2)*...*2*1 donde n>=0 y 0!=1
Entonces, ¿cómo podemos definir n! en términos 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 función recursiva
El factorial de un número ilustra muy bien
los aspectos básicos de un problema
recursivo
• Se resuelve en términos de sí mismo con
un valor más pequeño n-1 (caso recursivo)
• Tiene una condición de terminación (caso
base) en donde se calcula directamente el
resultado
0! = 1
Esto es, tiene un fin!! En algún momento
termina.
Ejemplo: factorial (iterativo - repetetitivo)
int factorial (int n) public int factorial (int n) {
0! =1
1! = 1 =1*1 = 1 * 0!
2! = 2 =2*1 = 2 * 1!
3! = 6 =3*2 *1 = 3 * 2!
4! = 24 = 4 * 3 * 2 * 1 = 4 * 3!
5! = 120 = 5 * 4 * 3 * 2 * 1 = 5 * 4!
...
N! = = N * (N – 1)!
¿Cómo le hace?
120 El fact(5) = 120
Llamada en el
main fact(5)
5! 120
5 * 4! 24
4 * 3! 6
3 * 2! 2
2* 1! 1
1 * 0! 1 Valor de
1 regreso
Solución
Aquí podemos ver la secuencia que toma el factorial
1 si N = 0 (base)
N! =
N * (N – 1) ! si N > 0 (recursión)
Segmento de
código
Está destinado a las variables
Segmento de
locales, parámetros de la
datos
función que se está
ejecutando y su valor de Segmento
regreso extra ( o
libre)
int suma(int x, int y) { Segmento de
int z; stack (pila)
z = x +y;
return z; Segmento del
} sistema
Llamada a una función iterativa
// función iterativa
int fact(int n) {
int f=1;
if(n==0|| n== 1)
return 1;
for(int i=1;i<=n; i++)
f *= i; i=1
return f;
} f=1
n=3
main() {
Regreso fact(3)
int f;
f = fact(3);
}
Ejemplo llamada recursiva
//función recursiva
int fact(int n) {
if(n==0)
return 1;
return (n*fact(n-1)); n=0
}
Regreso 1 *fact(0)
main() { n=1
int f; Regreso 2 *fact(1)
f = fact(3);
{ n=2
Regreso 3 *fact(2)
n=3
Regreso fact(3)
Recursividad vs. Iteración
Recursividad Iteración
Eficiencia en Puede requerir gastos Más eficiente
espacio considerables, sobre todo en
almacenamiento, ya que debe
guardar copias de variables
locales
Eficiencia en El tiempo de una llamada es Los ciclos son directos
tiempo costosa
1 2 3
• Ejemplo con 3 estacas y 4 discos
Dividir para vencer
• Muchas veces es posible dividir un problema en
subproblemas más pequeños, generalmente del mismo
tamaño, resolver los subproblemas y entonces
combinar sus soluciones para obtener la solución del
problema original.