La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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.

Presentaciones similares


Presentación del tema: "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."— Transcripción de la presentación:

1 Simulación de la recursión Estructuras de datos

2 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.

3 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

4 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.

5 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; }

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

7 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.

8 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;

9 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; }

10 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"); }

11 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;

12 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;

13 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; }


Descargar ppt "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."

Presentaciones similares


Anuncios Google