tema 7 - unne · 2020. 6. 10. · j.t.p. maria eugenia valesani - programacion 1 - fa.ce.na. 7....

38
J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na. Recursividad Tema 7

Upload: others

Post on 29-Jan-2021

4 views

Category:

Documents


0 download

TRANSCRIPT

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    Recursividad

    Tema 7

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.1 Introducción

    El concepto de recursión aparece en varias situaciones de la vida cotidiana, aunque en muchas no sabemos que estamos en presencia de este concepto, por ejemplo, sacar fotocopias de fotocopias, tomar una fotografía a otra fotografía.

    La recursión como herramienta de programación permite definir un objeto – por ejemplo una estructura de datos - en términos de si mismo. Un caso concreto de recursión ya visto en apartados anteriores son las listas circulares, en donde una lista se llama a si misma.

    Un ejemplo clásico en matemática es el factorial de un número, potencia o la serie de Fibonacci.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.1 Concepto

    Un programa o subprograma que se llama a si mismo se dice que es recursivo.

    El concepto de recursividad está ligado, en los lenguajes de programación, al concepto de procedimiento o función. Un procedimiento o función es recursivo cuando durante una invocación a él puede ser invocado a su vez él mismo.La recursividad es una de las formas de control más importantes en la programación. Los procedimientos recursivos son la forma más natural de representación de muchos algoritmos.

    Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de construcción. La base no es recursiva y es el punto tanto de partida como de terminación de la definición.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.1 Concepto

    Entonces:

    Base: La secuenciación, iteración condicional y selección son estructuras válidas de control que pueden ser consideradas como enunciados.

    Regla recursiva: Las estructuras de control que se pueden formar combinando de manera válida la secuenciación iteración condicional y selección también son válidos.Un conjunto de objetos está definido recursivamente siempre que:

    (B) algunos elementos del conjunto se especifican explícitamente(R) el resto de los elementos del conjunto se definen en términos de

    los elementos ya definidosdonde

    (B) se llama base(R) se llama cláusula recursiva

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.1 Concepto

    Observaciones:

    1. El procedimiento se llama a si mismo2. El problema se resuelve, resolviendo el mismo problema pero de tamaño menor3. La manera en la cual el tamaño del problema disminuye asegura que el caso base eventualmente se alcanzará.

    La recursividad es un método poderoso usado en inteligencia artificial, su poder es que algunos conceptos complejos pueden expresarse en una forma simple. Una definición recursiva difiere de una definición circular en que tiene una forma de escapar de su expansión infinita. Este escape se encuentra en la definición o porción no recursiva o terminal de la definición.

    Las fórmulas recursivas pueden aplicarse a situaciones tales como prueba de teoremas, solución de problemas combinatorios, algunos acertijos, etc.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.1 Concepto

    Ejemplo 1: Factorial

    Definición:factorial (n) = n! si n > 0factorial (n) = n*n-1*n-2* ... * 1 si n > 0

    el valor de 0! se define como factorial (0) = 1

    Su definición recursiva es:factorial (n) = 1 si n = 0 --> Basefactorial (n) = n* factorial (n-1)si n > 0 --> Regla recursiva

    así para calcular el factorial de 4:

    factorial (4) = 4 * factorial (3) = 4 * 6 = 24factorial (3) = 3 * factorial (2) = 3 *2 = 6factorial (2) = 2 * factorial (1) = 2 * 1 = 2factorial (1) = 1 * factorial (0) = 1 * 1 = 1

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    La recursión puede darse de dos maneras:

    Directa: El subprograma se llama directamente a si mismo. En la figura 7.1 el subprograma R, en alguna parte se llama a si mismo.

    ....................................................

    ....................................................

    ....................................................

    ....................................................

    llamada al subprograma R

    ....................................................

    ....................................................

    Subprograma R

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    Indirecta: Un programa llama a otro subprograma y este a su vez al primero El subprograma A llama al B y este a su vez llama al primero A, es decir que luego de tantas llamadas el control regresa al subprograma A. Otro caso de recursión indirecta es el caso b) de la figura, que muestra como un subprograma llama a otro y este a un tercero y una vez ejecutado el subprograma vuelve a donde fue llamado. En el ejemplo de la figura el programa A llama al B y este al C; cuando finaliza la ejecución C vuelve a donde fue llamado B y este a su vez al subprograma A – programa inicio.

    Subprograma A

    Subprograma B

    llamada a Bllamada a A

    caso a)

    Subprograma A

    Subprograma B

    llamada a B

    llamada a C

    Subprograma C

    caso b)

    En toda definición recursiva de un problema se debe establecer un estado básico. Es decir un estado en el cual la solución no se presente de manera recursiva, sino directamente. Además la entrada(datos) del problema debe ir acercándose al estado básico.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    ¿Cómo funciona la recursividad?

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    4!=4*3!

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    4!=4*3!

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    3!=3*2!

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    2!=2*1!

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    1!=1*0!=1*1

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    El factorial de un número entero positivo n se define como el producto del mismo por el factorial del número anterior, siendo el estado básico definido como 0! = 1.Simbólicamente se expresa:

    1 si n = 0 n! =

    n * (n-1)! si n > 0

    Por lo que el factorial de:0! = 11! = 1 * 0!2! = 2 * 1! Esta definición de n! es recursiva ya que se

    refiere a sí misma cuando invoca (n – 1) !3! = 3 * 2!4! = 4 * 3!..........n! = n * (n-1)!

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.2 Recursion Directa e Indirecta

    Luego nuestra función podría ser:

    Function Factorial ( n : Integer ) : Integer;begin

    If n < 2 Then Factorial := 1 else Factorial := n * Factorial ( n – 1);

    end;

    Recursividad Infinita

    Es muy importante que toda función recursiva tenga un caso en el que no se llame a sí misma, o las llamadas serían infinitas y el programa no tendría fin.

    Notese que si no chequeara inicialmente si n=0, la función se invocaría a sí misma infinitas veces y nunca terminaría de ejecutarse (en realidad en poco tiempo daría error). Por eso, siempre una función recursiva tiene una condición inicial en la que no debe llamarse a sí misma.

    Condición de Salida

    Cada llamadanos acerca a la salida

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.3 Funcionamiento Interno

    En la figura se ilustra el funcionamiento interno de la función factorial para el caso en que N = 4.

    4 * 3!

    Subprograma FAC(4)factorial (4)

    3 * 2!

    Subprograma FAC(3)factorial (3)

    llamada a FAC(3)

    llamada a FAC(2)

    devuelve FAC = 6

    2 * 1!

    Subprograma FAC(2)factorial (2)

    llamada a FAC(1)

    1 * 0!

    Subprograma FAC(1)factorial (1)

    llamada a FAC(0)

    1

    Subprograma FAC(0)factorial (0)

    devuelve FAC = 1

    devuelve FAC = 1

    devuelve FAC = 2

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.3 Funcionamiento Interno

    Cuando esta función es invocada, por ejemplo, para hallar el factorial del número 3, se crean en la memoria de la computadora las siguientes instancias:

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.3 Funcionamiento Interno

    y al finalizar comienza el retorno a la invocación anterior efectuándose las acciones que habían quedado pendientes.: Observe cómo una nueva

    invocación a la función Factorial, cuando aún no se ha terminado la invocación anterior, no afecta el valor de la variable local n que se creó en la invocación anterior. Esto es esencialmente el principio fundamental de las funciones o procedimientos recursivos, y que hace de estos un mecanismo cualitativamente superior;

    cada instancia interrumpida de la función o del procedimiento, por una llamada a otro procedimiento o función, conserva sus datos locales, aún cuando el procedimiento o función pueda ser nuevamente invocado.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    Ejemplo 1: Potencia de un numeroDefinición recursiva para elevar un número a una potencia: Un número elevado a la potencia cero produce la unidad; la potencia de un número se obtiene multiplicándolo por sí mismo elevando a la potencia menos uno.

    Por ejemplo:

    32 = 3*(31) = 3*(3*30) = 3*(3*1)= 3*(3) = 9El algoritmo de resolución

    ALGORITMO potencia(n k)INICIO

    SI (k = 0) ENTONCESpoten = 1

    SINOpoten = n * potencia (n,k-1)

    FINSIDEVOLVER poten

    FIN

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    Ejemplo 2: Serie de FibonacciEn matemáticas, la sucesión de Fibonacci es la siguiente sucesión infinita de números naturales:

    El primer elemento es 0, el segundo es 1 y cada elemento restante es la suma de los dos anteriores. A cada elemento de esta sucesión se le llama número de Fibonacci. Esta sucesión fue descrita en Europa por Leonardo de Pisa, matemático italiano del siglo XIII también conocido como Fibonacci. Tiene numerosas aplicaciones en ciencias de la computación, matemáticas y teoría de juegos.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    n si n 2

    Los números de Fibonacci se definen como:FN = FN-1 + FN-2 para N > 2F0 = F1 = 1

    que definen la secuencia: 1,1,2,3,5,8,13,21,34,55,89,144, .....

    Por ejemplo, si quisiéramos encontrar Fibonacci de 5, entonces:

    Fibonacci (5) = Fibonacci (4) + Fibonacci (3)Fibonacci (4) = Fibonacci (3) + Fibonacci (2)Fibonacci (3) = Fibonacci (2) + Fibonacci (1)Fibonacci (2) = Fibonacci (1) + Fibonacci (0)

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    El algoritmo de resolución

    ALGORITMO N Fib(E N n)VAR

    N fbINICIO

    SI (n

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    Ejemplo 3: Torres de HanoiUn problema típico a resolver con recursión es el de las Torres de Hanoi, ya que al aplicar esta herramienta el problema se simplifica enormemente.

    Las Torres de Hanói es un rompecabezas o juego matemático inventado en 1883 por el matemático francés Éduard Lucas

    Consiste en tres varillas verticales y un número indeterminado de discos que determinarán la complejidad de la solución. No hay dos discos iguales, están colocados de mayor a menor en la primera varilla ascendentemente, y no se puede colocar ningún disco mayor sobre uno menor a él en ningún momento..

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    El juego consiste en pasar todos los discos a la tercera varilla colocados de mayor a menor ascendentemente.

    Las reglas son:

    1. Sólo se puede mover un disco cada vez.

    2. Un disco de mayor tamaño no puede descansar sobre uno más pequeño que él mismo.

    3. Sólo puedes desplazar el disco que se encuentre arriba en cada varilla.

    A B C A B C

    a) b)

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    Para resolver el problema hay que respetar las reglas mencionadas anteriormente, por lo cual la única manera de mover el disco inferior será moviendo primero los (n-1) discos superiores. Dado que se quiere llevar el disco inferior a la torre B, deben colocarse primero los (n-1) discos en la torre auxiliar C. Estas operaciones pueden hacerse generales para todos los discos, distinguiéndose básicamente tres subtareas:

    - Transferir (n-1) discos de la torre A a la torre C.- Mover un disco de la torre A a la torre B.- Transferir (n-1) discos de la torre C a la torre B.

    Si se analiza la operación del paso 3, puede observarse que presenta el mismo problema: trasladar una cierta cantidad de discos de una torre a otra, usando siempre una tercera como auxiliar, razón por la cual debe existir una solución recursiva del problema. El número de discos disminuye en 1 con cada llamada, llegando a su estado básico cuando el número de discos a mover es 1. En este caso el disco se mueve directamente a la torre deseada.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    Para resolver el problema hay que respetar las reglas mencionadas anteriormente, por lo cual la única manera de mover el disco inferior será moviendo primero los (n-1) discos superiores. Dado que se quiere llevar el disco inferior a la torre B, deben colocarse primero los (n-1) discos en la torre auxiliar C. Estas operaciones pueden hacerse generales para todos los discos, distinguiéndose básicamente tres subtareas:

    - Transferir (n-1) discos de la torre A a la torre C.- Mover un disco de la torre A a la torre B.- Transferir (n-1) discos de la torre C a la torre B.

    Si se analiza la operación del paso 3, puede observarse que presenta el mismo problema: trasladar una cierta cantidad de discos de una torre a otra, usando siempre una tercera como auxiliar, razón por la cual debe existir una solución recursiva del problema. El número de discos disminuye en 1 con cada llamada, llegando a su estado básico cuando el número de discos a mover es 1. En este caso el disco se mueve directamente a la torre deseada.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    A B C A B C

    a) b)

    A B C

    c)

    A B C

    d)

    A B C

    e)

    A B C

    f)

    A B C

    g)

    A B C

    h)

    La solución al problema de Hanoi para N = 3 es según muestra la figura es:

    Estado inicial.

    Luego de mover un disco de A a B.

    Luego de mover un disco de A a C.

    Luego de mover de B a C.

    Luego de mover un disco de A a B.

    Luego de mover un disco de C a A.

    Luego de mover un disco de C a B

    Estado Final. Resultado de mover el último disco de A a B.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    A B C A B C

    a) b)

    A B C

    c)

    A B C

    d)

    A B C

    e)

    A B C

    f)

    A B C

    g)

    A B C

    h)

    La solución se logra luego de 7 movimientos para N=3.

    Se puede concluir diciendo que el número de movimientos (M) está dado por la siguiente fórmula:

    M = 2 n - 1

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos

    Leyenda

    En un templo de Benarés, se encontraba una cúpula que señalaba el centro del mundo. Allí estaba una bandeja sobre la cual existían tres agujas de diamante. En una mañana lluviosa, un rey mandó a poner 64 discos de oro, siendo ordenados por tamaño: el mayor en la base de la bandeja y el menor arriba de todos los discos.

    Después de la colocación, los sacerdotes del templo intentaron mover los discos entre las agujas, según las leyes que se les habían entregado: "El sacerdote de turno no debe mover más de un disco a la vez, y no puede situar un disco de mayor diámetro encima de otro de menor diámetro".

    Hoy no existe tal templo, pero el juego aún perduró en el tiempo...

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos – Torre de Hanoi

    Leyenda

    Otra leyenda cuenta que Dios al crear el mundo, colocó tres varillas de diamante con 64 discos en la primera. También creó un monasterio con monjes, los cuales tienen la tarea de resolver esta Torre de Hanói divina.

    El día que estos monjes consigan terminar el juego, el mundo acabará.

    No obstante, este leyenda resultó ser un invento publicitario del creador del juego, el matemático Éduard Lucas. En aquella época, era muy común encontrar matemáticos ganándose la vida de forma itinerante con juegos de su invención, de la misma forma que los juglares hacían con su música.

    Además, invita a realizarse la pregunta: "si la leyenda fuera cierta, ¿cuándo será el fin del mundo?"

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos – Torre de Hanoi

    Solución recursiva a las Torres de HanoiEl problema de las Torres de Hanói es curiosísimo porque su solución es muy rápida de calcular, pero el número de pasos para resolverlo crece exponencialmente conforme aumenta el número de discos.

    – Si n=1 mueva el disco de A a C y pare– Mueva los n-1 discos superiores de A a B, con C auxiliar– Mueva los discos restantes de A a C– Mueva los n-1 discos de B a C, usando A como auxiliar

    Planteamos un procedimiento recursivo con cuatro parámetros:

    1. El número de discos a mover.2. El palo origen desde donde moverlos.3. El palo destino hacia el que moverlos.4. El palo auxiliar.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.4 Ejemplos – Torre de Hanoi

    Solución recursiva a las Torres de HanoiALGORITMO Mueve(E N n; E Tpalos origen,auxiliar,destino)INICIOSI n == 1 ENTONCES

    Mueve un disco del palo origen al destinoSINO

    Mueve(n-1,origen,destino,auxiliar)Mueve un disco del palo origen al destinoMueve(n-1,auxiliar,origen,destino)

    FINSIFIN

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.5 Recursividad versus iteración

    La recursividad y la iteración (ejecución en bucle) están muy relacionadas, cualquier acción que pueda realizarse con la recursividad puede realizarse con iteración y viceversa. Normalmente, un cálculo determinado se prestará a una técnica u otra, sólo necesita elegir el enfoque más natural o con el que se sienta más cómodo.Tanto la iteración como la recursión se basan en una estructura de control: - la iteración utiliza una estructura repetitiva- la recursión utiliza una estructura de selección.

    La iteración y la recursión implican ambas repetición: - la iteración utiliza explícitamente una estructura repetitiva- la recursión consume la repetición mediante llamadas repetidas.

    La iteración y la recursión implican cada una un test mientras que la recursión termina cuando se reconoce un caso base o la condición de salida se alcanza.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.5 Recursividad versus iteración

    Los procesos recursivos suelen ocupar más memoria y tardar un poquito más que los iterativos porque cuando el compilador llama a una subrutina guarda todas las variables locales.

    En consecuencia, ¿Cuáles son las razones para elegir la recursión? La razón fundamental es que existen numerosos problemas complejos que poseen naturaleza recursiva y, en consecuencia, son más fáciles de implementar con algoritmos de este tipo. Sin embargo, en condiciones críticas de tiempo y de memoria, es decir, cuando el consumo de tiempo y memoria sean decisivos o concluyentes para la resolución del problema, la solución a elegir debe ser, normalmente la iterativa.

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.5 Recursividad versus iteración

    Desarrolar el Factorial con un proceso iterativo seria:Function Factorial ( n : Integer ) : Integer;Vark,P:integerBeginP:=1;For k:=1 To n do

    P:=P*k;Factorial:=P;End;La solución recursiva del mismo problema sería:Function Factorial ( n : Integer ) : Integer;Begin

    If n=0 Then Factorial:=1 Else Factorial:=n*Factorial(n-1);

    End;

  • J.T.P. Maria Eugenia Valesani - Programacion 1 - Fa.Ce.Na.

    7. Recursividad7.6 Ventajas y desventajas

    Ventajas de la Recursión ●Soluciones simples, claras●Soluciones elegantes.●Soluciones a problemas complejos.

    Desventajas de la Recursión: INEFICIENCIA- Sobrecarga asociada con las llamadas a subalgoritmos• Una simple llamada puede generar un gran numero de llamadas recursivas. (Fact(n) genera n llamadas recursivas)• ¿La claridad compensa la sobrecarga?• El valor de la recursividad reside en el hecho de que se puede usar para resolver problemas sin fácil solución iterativa.- La ineficiencia inherente de algunos algoritmos recursivos.

    La recursividad se debe usar cuando sea realmente necesaria, es decir, cuando no exista una solucion iterativa simple.