Simulación de la recursión Estructuras de datos. Llamada y regreso de una función Al llamar a una función se realizan los siguientes tres pasos: 1. Transferencia.

Slides:



Advertisements
Presentaciones similares
Laboratorio Lenguaje de Programación ING2101
Advertisements

2. Manejo de memoria Manejo de memoria estática
Curso de java básico (scjp)
Estructura de Datos Unidad 4. Recursividad Dra. María Lucía Barrón Estrada Enero-Junio 2007.
Programación Interactiva Fundamentos de Programación
Funciones y recursividad
LOGROS DEL PERÍODO Utiliza de forma correcta las funciones para entrada y salida de datos en c++. Utiliza los elementos básicos de un programa en c++.
Repaso para la construcción del intérprete 2012
Fundamentos de la Programación Estructurada
Programacion de Computadora Prof. Obadiah Oghoerore.
Funciones. Programación, Algoritmos y Estructuras de Datos.
Tipos de Datos Básicos y Estructurados
Una variable en un programa es algo con un nombre, cuyo valor puede variar. La manera en que el compilador y enlazador maneja esto es asignando un bloque.
FUNCIONES EN C.
INFORMATICA I Funciones CLASE 13.
Programación en C (Segunda Parte) DATSI, FI, UPM José M. Peña
ESTRUCTURA DEL LENGUAJE C
Programación Estructurada
Introducción al lenguaje C++
Algoritmos y Estructuras de Datos
Ocurre con frecuencia, tanto en programación como en la vida real, que las decisiones que se nos pide tomar son más complicadas que una simple selección.
SOBRECARGA DE FUNCIONES
Unidad 3 Punteros.
Recursión Se dice que un método es recursivo si forma parte de sí mismo o se define en función de sí mismo. La recursión es un medio particularmente poderoso.
Funciones “En C” Semestre de Otoño 2006 Claudio Gutiérrez-Soto.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Funciones en lenguaje C
Funciones y procedimientos
FUNCIONES EN C.
CI TEORIA semana 8 Subprogramas o funciones Definición de funciones.
Programación I Teoría VI: Recursividad
Estructuración y modularidad de los programas Fundamentos de Programación/ Programación I
Estructuras dinámicas de datos, TAD Lista, parte 2
Tema 4: Sentencias de control
Programa “Coordenadas” Ing. Arturo Díaz Vargas Departamento de Sistemas División de Ciencias Básicas e Ingeniería UNIVERSIDAD AUTONOMA METROPOLITANA.
Práctica 7 AOC. Gestión de la pila Una pila es una estructura de datos caracterizada por que el último dato que se almacena es el primero que se obtiene.
LENGUAJE “C” Programación.
MIPS Intermedio.
Semana 5 Subprogramas..
Ejemplo Supongamos que queremos realizar un sistema que trabaje con figuras geométricas planas. El sistema debe poder mostrar información de una figura.
Programación III Clase 07 Funciones.
FUNCIONES EN C.
El lenguaje de programación Java
Programación III Clase 06 Funciones.
Archivos.
3.  Recursividad.
Java. Java nació el año 1991, por un par de ingenieros de la Sun Microsystems.
Pila1UVM Pilas. Pila2UVM Pila3UVM 2.1 Objetivos El estudiante manejará el tad Pila contigua.
Material de apoyo Unidad 4 Estructura de datos
Unidad II Introducción a la programación en C++
FUNCIONES Conceptos básicos. Retorno de una función Clases de funciones. Paso de parámetros. Funciones y arrays.
Recursividad (2 clases) 1. Nivelación Funciones Menú Vectores String
PUNTEROS Y REFERENCIAS
Trazado. 1 Intercambio sin error #include void intercambio(int *, int *); /* prototipo */ main(){ int a=1,b=2; printf("a=%d b=%d\n",a,b); intercambio(&a,&b);
Estructura de Datos En C++
Recursividad. 2 Son funciones que se llaman a sí mismas. Requisitos: – Deben retornar un valor. – Deben tener expresiones en las que se llaman a sí mismas:
Ing. Betty Suárez Torres
UNIVERSIDAD LATINA INTRODUCCION A LA PROGRAMACION INSTRUCCIONES INTERATIVAS.
Pelando la cebolla 1. Aquí discutiremos lo necesario del lenguaje necesario para implementar una metodología que llamo “pelando la cebolla”. Permite abordar.
INTRODUCCION A LA PROGRAMACION

LENGUAJE “C” Programación.
Estructura de Datos En C++
Pilas y Colas Cursos Propedéuticos 2006 Programación y Estructuras de Datos Manuel Montes Claudia Feregrino
 Las funciones son un conjunto de instrucciones que realizan una tarea específica. En general toman unos valores de entrada, llamados parámetros y proporcionan.
Funciones Copyright © 2005 Unidad 1. Copyright © 2005 Objetivos del Aprendizaje Explicar la naturaleza y usos de las funciones. Describir algunas funciones.
Conceptos y Lenguaje Imperativo
MEMORIA DINÁMICA.
TIPOS DE DATOS Estructuras de control y repetición PARCIAL III.
1 Conceptos Fundamentales de Programación Introducción a la Informática Departamento de Sistemas Universidad del Cauca 2006.
Transcripción de la presentación:

Simulación de la recursión Estructuras de datos

Llamada y regreso de una función Al llamar a una función se realizan los siguientes tres pasos: 1. Transferencia de argumentos 2. Ubicación e inicialización de variables locales 3. Transferencia de control a ala función Al regresar de una función se realizan las siguientes tres acciones: 1. Recuperar la dirección de retorno 2. Liberar el área de datos de la función (variables locales) 3. Efectuar un salto a la dirección de retorno de la función.

Llamada a b Llamada a c Dirección de retorno Llamada a d Dirección de retorno Llamada a b Llamada a c Dirección de retorno Llamada a d Dirección de retorno Control

Llamada de funciones recursivas Cada que se llama a una función recursiva se asigna una nueva área de datos para la llamada. Cada regreso ocasiona la liberación del área de datos vigente y el área de datos vigente pasa a ser la que precede a la vigente. Para manejar estas áreas de datos puede usarse una pila.

Simulación del factorial int fact(int n){ int x,y; if(n==0) return 1; else{ x = n – 1; y = fact(x); return n*y; } El área de3 datos debe guardas x, y, n y la dirección de regreso. Hay dos direcciones de retorno: la sentencia y = fact(x) al programa principal Las etiquetamos como label1: return result; label2: y = result; La dirección se almacenará como un entero i. Para ejecutar un regreso se tiene el código: switch(i){ case 1:goto label1; case 2:goto label2; }

Pila de datos struct dataarea{ int param; int x; long y; short retaddr; }; struct stack{ int top; dataarea items[MAXSTACK]; }; dataarea currarea; long result

Regreso y llamada recursiva i = currarea.retaddr; popsub(&s,&currarea); switch(i){ case 1:goto label1; case 2:goto label2; } Código para regresar de una llamada push(&s,&currarea); currarea.param = currarea.x; currarea.retaddr = 2; Código para hacer una llamada Al iniciar se debe inicial currarea.param = n y currarea.readdr = 1 para regresar al programa principal. Debemos insertar un área de datos vacía para evitar que popsub genere un bajoflujo.

Primera versión long simfact(int n){ dataarea currarea; stack s; short i; long result; s.top = -1; //inicialización de un area de datos simulada currarea.param = 0; currarea.x = 0; currarea.y = 0; currarea.retaddr = 0; //colocar el área de datos simulada en el área push(&s,&currarea); currarea.param = n; currarea.retaddr = 1; start: //este es el inicio de la rutina simulada if(currarea.param == 0){ //simulación de return 1; result = 1; i = currarea.retaddr; popsub(&s,&currarea); switch(i){ case 1:goto label1; case 2:goto label2; } currarea.x = currarea.param-1; push(&s,&currarea); currarea.param = currarea.x; currarea.retaddr = 2; goto start;

label2: //punto al cual se regresa de la llamada recursiva currarea.y = result; //simulación de return n*y; result = currarea.param*currarea.y; i = currarea.retaddr; popsub(&s,&currarea); switch(i){ case 1:goto label1; case 2:goto label2; } label1: //punto de retorno a main return result; }

Simulación de torres de Hanoi #include void moverDisco(int n, int desde, int hacia, int usando){ if(n == 1){ printf("Mover disco 1 desde %d a %d\n",desde,hacia); }else{ moverDisco(n-1,desde, usando, hacia); printf("Mover disco %d desde %d a %d\n",n,desde,hacia); moverDisco(n-1,usando, hacia, desde); } main(){ moverDisco(5,1,3,2); system("pause"); }

Primera versión void simtowers(int n,int frompeg,int topeg,int auxpeg){ dataarea currarea; stack s; short i; char temp; s.top = -1; currarea.nparam = 0; currarea.fromparam = ' '; currarea.toparam = ' '; currarea.auxparam = ' '; currarea.retaddr = 0; //colocar el área de datos simulada en el área push(&s,&currarea); currarea.nparam = n; currarea.fromparam = frompeg; currarea.toparam = topeg; currarea.auxparam = auxpeg; currarea.retaddr = 1;

start: //este es el inicio de la rutina simulada if(currarea.nparam == 1){ printf("\nmover disco 1 de '%c' a '%c'", currarea.fromparam, currarea.toparam); i = currarea.retaddr; popsub(&s,&currarea); switch(i){ case 1:goto label1; case 2:goto label2; case 3:goto label3; } push(&s,&currarea); currarea.nparam--; temp = currarea.auxparam; currarea.auxparam = currarea.toparam; currarea.toparam = temp; currarea.retaddr = 2; goto start;

label2: //punto al cual se regresa de la primera llamada recursiva printf("\nmover disco %d de '%c' a '%c'", currarea.nparam, currarea.fromparam, currarea.toparam); //Esta es la segunda llamada recursiva push(&s,&currarea); currarea.nparam--; temp = currarea.fromparam; currarea.fromparam = currarea.auxparam; currarea.auxparam = temp; currarea.retaddr = 3; goto start; label3://punto de regreso de la segunda llamada recursiva i = currarea.retaddr; popsub(&s,&currarea); switch(i){ case 1:goto label1; case 2:goto label2; case 3:goto label3; } label1: //punto de retorno return; }