programacion estructurada: tema 5. recursividad
TRANSCRIPT
![Page 1: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/1.jpg)
PROGRAMACION ESTRUCTURADA:Tema 5. Recursividad
Presenta: David Martínez Torres
Universidad Tecnológica de la Mixteca
Instituto de Computación
Oficina No. 37
![Page 2: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/2.jpg)
Contenido
1. Definición y características de la recursividad2. Llamadas recursivas directas e indirectas3. Comparación entre funciones iterativas y
recursivas
![Page 3: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/3.jpg)
1. Definición y características de la recursividad
Una función recursiva es una función que se llama a sí misma, ya sea directa o indirecta a través de otra función.
Componentes
Caso base. Es el resultado más simple, lo que conoce la función.
Paso de recursión. Llamada a la misma función, pero con el problema poco menos complejo que el original. También puede incluir la palabra reservada return.
![Page 4: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/4.jpg)
2. Recursión directa e indirecta
Según el modo en que se realiza la llamada
Directa: Cuando un método/función se invoca así mismo. Ej., factorial, potencia, etc.
Indirecta: Cuando un método/función puede invocar a una segunda función/método que a su vez invoca a la primera
4
![Page 5: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/5.jpg)
2. Recursión directa
Calculo del factorial, ejemplo recursivo
5
![Page 6: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/6.jpg)
2. Recursión directa
6
![Page 7: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/7.jpg)
2. Recursión directa
int factorial(int n){
int fact;
if(n==0||n==1) //caso base
fact=1;
else
fact=n*factorial(n-1);
return fact;
}
7
![Page 8: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/8.jpg)
2. Recursión directa
Cálculo de la potencia, ejemplo de problema recursivo
8
![Page 9: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/9.jpg)
2. Recursión directa
La serie Fibonacci
0,1,1,2,3,5,8,13,21,34, …
Empieza con 0 y 1, y tiene la propiedad que cada número Fibonacci subsecuente es la suma de los dos números Fibonacci previos.
La serie Fibonacci se puede defininir recursivamente de la siguiente manera:
fibonacci(0)=0
fibonacci(1)=1
fibonacci(n)=fibonacci(n-1)+fibonacci(n-2)
![Page 10: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/10.jpg)
2. Recursión directa
![Page 11: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/11.jpg)
Torres de Hanoi /1
Definición del problema:
![Page 12: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/12.jpg)
Torres de Hanoi /2
Paso 0 – Inicial
Configuración inicial:
La torre A contiene n discos
de diferentes tamaños.
En el tope sólo pueden ir los
discos más pequeños
Objetivo:
Mover todos los discos de la torre A a la torre B
Mover:
Toma el disco del tope de la torre y muévelo a otra torre.
Solo se puede mover un disco cada vez
Después de un movimiento todos los discos han de estar en alguna torre.
![Page 13: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/13.jpg)
Torres de Hanoi /3
Paso 2. Recursión 1
Paso 3. Recursión 1 Paso 4. Recursión 1
Paso 1. Recursión 1
Mueve el disco tope de la torre A a latorre C
![Page 14: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/14.jpg)
Torres de Hanoi /4
Paso 5. Recursión 1 Paso 6. Recursión 1
Paso 7. Recursión 1 Paso 8. Mover
![Page 15: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/15.jpg)
Torres de Hanoi /5
Paso 11. Recursión 2 Paso 12. Recursión 2
Paso 9. Recursión 2 Paso 10. Recursión 2
![Page 16: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/16.jpg)
Torres de Hanoi /6
Paso 15. Recursión 2
Paso 13. Recursión 2 Paso 14. Recursión 2
![Page 17: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/17.jpg)
Ideas para una solución recursiva
17
![Page 18: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/18.jpg)
void moverTorres( int n, char desde, char hacia,char temp){
if( n== 1 )
printf("Mueve de %c a %c .\n",desde,hacia);
else {
moverTorres( n- 1, desde, temp, hacia);
printf("Mueve de %c a %c .\n",desde,hacia);
moverTorres( n- 1, temp, hacia, desde);
}
}
18
![Page 19: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/19.jpg)
2. Recursión indirecta
int main(){
system("cls");
A('D');
printf("\n");
system("pause");
return 0;
}
void A(char c){
if(c>'A')
B(c);
putchar(c);
}
void B(char c){
A(--c);
}
19
![Page 20: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/20.jpg)
3. Comparación entre funciones recursivas e iterativas
Se basan en una estructura de control:
las iterativas utilizan una estructura de repetición; las recursivas una estructura de selección.
Incluyen un ciclo de repetición:
la iteración utiliza una estructura de repetición explícita; la recursión lo hace mediante llamadas de función repetidas.
Incluyen una prueba de terminación:
la iteración termina cuando falla la condición de continuación del ciclo; la recursión termina cuando se reconoce el caso base.
20
![Page 21: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/21.jpg)
3. Comparación entre funciones recursivas e iterativas
Rendimiento
En el caso de la recursión el invocar repetidamente la misma función, puede resultar costosa en tiempo de procesador y espacio de memoria.
Por el contrario la iteración se produce dentro de una función.
21
![Page 22: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/22.jpg)
3. Comparación entre funciones recursivas e iterativas
¿Cuándo elegir recursión?
La razón fundamental es que existen numerosos problemas complejos que poseen naturaleza recursiva, por lo cual son más fáciles de implementar con este tipo de algoritmos
Sin embargo, en condiciones críticas de tiempo y de memoria, la solución a elegir debe ser normalmente de forma iterativa.
22
![Page 23: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/23.jpg)
Ejemplo. La suma de los elementos del arreglo
int suma(int vector[], int fin){
int result;
if(fin==0)
result=vector[0];
else
result=vector[fin]+suma(vector,fin-1);
return result;
}
![Page 24: PROGRAMACION ESTRUCTURADA: Tema 5. Recursividad](https://reader030.vdocuments.pub/reader030/viewer/2022012409/616a453911a7b741a350ac72/html5/thumbnails/24.jpg)
7. Referencias
1. Joyanes Aguilar, Luis (1996) Fundamentos de programación, Algoritmos y Estructura de datos. McGraw-Hill, México.
2. Deitel & Deitel (2001) C++ Como programar en C/C++.Prentice Hall
3. Kerrighan y Ritchie “El lenguaje de programación”. Prentice Hall
4. Gottfried, Byron (1999) “Programación en C” McGrawHill, México.
5. Levine Gutierrez, Guillermo (1990) Introducción a la computación y a la programación estructurada. McGraw-Hill, México.
6. Levine Gutierrez, Guillermo (1990) Introducción a la computación y a la programación estructurada. McGraw-Hill, México.
7. H. Schildt, C++ from the Ground Up, McGraw-Hill, Berkeley, CA, 1998
8. Keller,,AL;Pohl,Ira. A Book on C. 3 ª edición. Edit.Benjamin umnings.1995