Descargar

Estructuras de datos y algoritmos II

Enviado por Pablo Turmero


Partes: 1, 2

    edu.red

    Introducción Diccionario castellano

    recurrir volver una cosa al sitio de donde salió; retornar, repetirse, reaparecer; (poco frecuente) recurrir a algo -> hacer uso de ello (más común)

    edu.red

    Introducción Subprogramas recurrentes

    se invocan (llaman) a sí mismos definidos en términos de sí mismos

    edu.red

    Circularidad Recurrencia inútil int P(){ return  P; }//fin P

    edu.red

    Circularidad Termina con un error de ejecución: no hay más memoria (p.ej:'stack overflow') ¿ Por qué ? cada vez que un programa P llama otro Q debe guardarse una indicación del punto en P donde el control debe retornar al finalizar la ejecución de Q las llamadas a procedimientos pueden encadenarse arbitrariamente Q1 -> Q2 -> Q3 -> … -> Qn -> …

    edu.red

    Circularidad Hay una estructura de datos donde se almacenan sucesivos puntos de retorno: En general se tiene: P -> Q1 -> Q2 -> Q3 -> … -> Qn donde Qn es el subprograma que se está ejecutando

    edu.red

    Circularidad Paralelamente, se ha formado la estructura de "puntos de retorno": p0, p1, p2, …, pn-1 p0 -> punto de retorno en P p1 -> punto de retorno en Q1 … pn-1 -> punto de retorno en Qn-1

    edu.red

    Circularidad La estructura crece con cada nueva llamada (un lugar) y decrece al terminar la ejecución de un subprograma.

    La estructura se comporta como una PILA (análogo a una pila de platos)

    edu.red

    Circularidad El tope de la pila es el punto donde debe retornarse el control tras la terminación del subprograma corriente.

    Por lo tanto, si el subprograma corriente llama a otro, el correspondiente punto de retorno debe colocarse como nuevo tope de la pila

    Y al finalizar un subprograma, se usa el tope como dirección de retorno y se lo remueve de la pila.

    pn-1 pn-2 . . .p1 p0

    edu.red

    Circularidad Volviendo al ejemplo de "recurrencia inútil":

    la pila crece infinitamente, pero la memoria de la máquina es finita, por lo tanto, en algún momento no hay más memoria (stack overflow = desbordamiento de la pila)

    edu.red

    Ejemplo void ejemplo P(){ int x;   scanf("%d",&x);     if esPrimo(x)     printf("Es Primon");   else     printf("No es Primon");       P();//llamada recursiva }

    edu.red

    Ejemplo (continuación) En principio, permitiría implementar un programa interativo.

    Pero también termina por desbordar la pila (stack), en las implementaciones elementales.

    Este es un ejemplo de recurrencia infinita

    edu.red

    Circularidad

    Estas recurrencias: pueden tener sentido en principio

    pero terminan por desbordar la memoria (al menos con las implementaciones comunes de llamadas a subprogramas)

    Partes: 1, 2
    Página siguiente