Sei sulla pagina 1di 20

Estructura de datos y

algoritmos
Unidad 05 Recursividad y
Ordenamiento

Profesores

Alfredo Granda
Juan Ramrez

Unidad 05 Recursividad y
Ordenamiento
Objetivos

Definicin
Ejemplos
Funciones

Definicin

Recursividad
Se denomina as a una funcin que para cumplir con su
objetivo se llama a si misma.
Al llamarse a si misma, resuelve un problema menos
complejo.
Llegado un punto, el problema es tan simple que puede
ser resuelto sin volverse a llamar a si misma.
Generalmente un algoritmo recursivo tiene 3 partes:
La llamada a si mismo.
La condicin de parada.
El cdigo a ejecutar si la condicin de parada es cumplida.

Reglas del buen uso de la


Recursividad
Caso Base: el caso base es el que se puede resolver sin
recursin. Se debe tener al menos un caso base, as no se
entrara a bucles infinitos.
Progreso: la llamada recursiva debe siempre tratar de
acercarse al caso base.
Nunca debe usarse para reemplazar un ciclo FOR. Cuando
la recursin esta bien hecha, se hace difcil convertirla en
una iteracin sencilla con FOR o WHILE o REPEAT.
Nunca se debe duplicar el resolver el mismo problema en
llamadas recursivas separadas como en el caso del
Fibbonacci.

Recursividad: Eficiente?
No necesariamente, de hecho casi nunca
es el caso que sea eficiente.
La ventaja es que puede simplificar
enormemente la codificacin de una
solucin al problema (poco cdigo, fcil
correccin de errores).
Debe usarse con cuidado, siempre tener
en cuenta todas las reglas de buen uso de
recursin.

Ejemplos

Ejemplo 1: Factorial
El factorial de N (o N!) es el producto de
todos los X (enteros) tales que N >= X >=
1.
As:
N! = 1 x 2 x x N-1 x N
Adems:
0! = 1

Ejemplo 1: Funcin factorial


int factorial (int n)
{
if ((n==0) || (n==1))
return 1;
else
return (n * factorial(n-1));
}

Cumple las reglas?


Caso base?
Progreso?
Reemplazo de FOR?
Duplicacin?

Ejemplo 2: Nmeros
Triangulares
Un numero triangular se obtiene de una
serie, donde el numero N no es sino la
suma de N y el numero triangular N-1.
As:
1, 3, 6, 10, 15, 21
1, 2+1, 3+3, 4+6, 5+10, 6+15
Como escribir una funcin que dado N, me
de el numero triangular respectivo?

Ejemplo 2: Funcin Triangular


int Triangular(int n)
{
if (n == 1)
return 1;
else
return (n + Triangular(n-1));
}

Cumple las reglas?


Caso base?
Progreso?
Reemplazo de FOR?
Duplicacin?

Ejemplo 3: Fibbonacci
La serie Fibbonacci esta definida como:
F0 = 0,
F1 = 1,
Fi = Fi-1 + Fi-2

(i >=2)

Serie Fibbonacci:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34 .

Ejemplo 3: Funcin Fibbonacci


int Fibbonacci(int n)
{
if (n == 0 || n == 1)
return n;
else
return (Fibbonacci(n-1) + Fibbonacci(n-2));
}

Cumple las reglas?


Caso base?
Progreso?
Reemplazo de FOR?
Duplicacion?

Ejercicios

Ejercicio 1

Implementar un
permita imprimir
invertido de altura
Ingrese N: 5
*****
****
***
**
*

mtodo recursivo que


en consola un tringulo
N.

Ejercicio 2

Implementar un mtodo recursivo que


permita imprimir en consola un tringulo de
altura N.
Ingrese N: 5
*
**
***
****
*****

Ejercicio 3

Implementar un mtodo recursivo que


permita imprimir un nmero entero al revs.

Ingrese el nmero: 123456


El nmero al revs es: 654321

Ejercicio 4

Implementar un mtodo recursivo que permita


imprimir una lista simplemente enlazada (sin numero
de elementos y sin puntero al final) desde atrs hacia
adelante. (La solucin debe ser de orden lineal O(N))
Por ejemplo si tenemos una lista simple de enteros con los datos:
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> NULL
Debemos imprimir los datos:
6 5 4 3 2 1

Ejercicio 5

Resolver
el
ejercicio
4
sin
utilizar
recursividad. Utilizar una pila para resolver el
problema.

Ejercicio 6

Hacer un algoritmo que permita generar


todas las combinaciones de nmeros de X
dgitos.
Ingrese X: 3
111
112
113
121
122
123
211
212
213
221
222
223
311
312
313
321
322
323
331
332
333

Potrebbero piacerti anche