SlideShare una empresa de Scribd logo
1 de 40
Descargar para leer sin conexión
Estructuras de Datos



Recursividad
Ing° Pedro Beltrán
     Canessa




                      1
Ejemplo Matrushka
   La Matrushka es una artesanía tradicional rusa.
    Es una muñeca de madera que contiene otra
    muñeca más pequeña dentro de sí. Esta
    muñeca, también contiene otra muñeca dentro.
    Y así, una dentro de otra.




                                                      2
¿Qué es la recursividad?

   La recursividad es un concepto fundamental en
    matemáticas y en computación.
   Es una alternativa diferente para implementar
    estructuras de repetición (ciclos). Los módulos
    se hacen llamadas recursivas.
   Se puede usar en toda situación en la cual la
    solución pueda ser expresada como una
    secuencia     de    movimientos,      pasos   o
    transformaciones gobernadas por un conjunto de
    reglas no ambiguas.
                                                 3
Función recursiva
Las funciones recursivas se componen de:
   Caso base: una solución simple para un caso
     particular (puede haber más de un caso
     base). La secuenciación, iteración
     condicional y selección son estructuras
     válidas de control que pueden ser
     consideradas como enunciados.

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

                                                              4
Función recursiva
     Caso recursivo: una solución que involucra
      volver a utilizar la función original, con
      parámetros que se acercan más al caso
      base. Los pasos que sigue el caso
      recursivo son los siguientes:
      1. El procedimiento se llama a sí mismo
      2. El problema se resuelve, resolviendo el
         mismo problema pero de tamaño menor
      3. La manera en la cual el tamaño del
         problema disminuye asegura que el caso
         base eventualmente se alcanzará

                                                   5
Función recursiva



          =
                    +




                        6
Ejemplo: factorial
 Escribe un programa que calcule el factorial (!)
 de un entero no negativo. He aquí algunos
 ejemplos de factoriales:

     0! = 1
     1! = 1
     2! = 2        2! = 2 * 1!
     3! = 6        3! = 3 * 2!
     4! = 24       4! = 4 * 3!
     5! = 120      5! = 5 * 4!

                                                    7
Ejemplo: factorial (iterativo)
int factorial (int n)    public int factorial (int n) {

comienza                   int fact = 1;

   fact  1                for (int i = 1; i <= n; i++)

   para i  1 hasta n      fact *= i;

       fact  i * fact     return fact;

   regresa fact            }

termina

                                                     8
Ejemplo: factorial (recursivo)
int factorial (int n)               public int factorial (int n) {
comienza                              if n == 0 return 1;
   si n = 0 entonces
                                      else
        regresa 1
   otro                               return factorial (n-1) * n;
        regresa factorial (n-1)*n     }
termina



                                                               9
Ejemplo:
   A continuaciòn se puede ver la secuencia de
    factoriales.

     0!  =1
     1! = 1   = 1 * 1 = 1 * 0!
     2! = 2   = 2 * 1 = 2 * 1!
     3! = 6   = 3 * 2 = 3 * 2!
     4! = 24 = 4 * 6 = 4 * 3!
     5! = 120 = 5 * 24 = 5 * 4!
     ...
     N! =     = N * (N – 1)!

                                                  10
11
Solución
Aquí podemos ver la secuencia que toma el factorial

                   1                 si N = 0 (base)
N! =

                    N * (N – 1) !    si N > 0 (recursión)



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.
                                                            12
Solución Recursiva
Dado un entero no negativo x, regresar el factorial de x fact:
Entrada n entero no nogativo,
Salida:entero.
                            Es importante determinar
 int fact (int n)           un caso base, es decir un
                            punto en el cual existe una
{                           condición por la cual no se
   if (n == 0)              requiera volver a llamar a
                            la misma función.
     return 1;
   else
     return fact(n – 1) * n ;
}
                                                            13
¿Cómo funciona la recursividad?
 Llamadas recursivas




 Resultados de las llamadas recursivas




                                         14
¿Por qué escribir programas recursivos?


   Son mas cercanos a la descripción
   matemática.
  Generalmente mas fáciles de analizar
  Se adaptan mejor a las estructuras de
   datos recursivas.
  Los algoritmos recursivos ofrecen
   soluciones estructuradas, modulares y
   elegantemente simples.

                                           15
¿Cómo escribir una función en forma
recursiva?
<tipo_de_regreso><nom_fnc> (<param>){
  [declaración de variables]
  [condición de salida]
  [instrucciones]
  [llamada a <nom_fnc> (<param>)]
  return <resultado>
}

                                        16
Ejercicio

Considere la siguiente ecuación recurrente:

 an = an-1 + 2n
 a0 = 1

Escribe el algoritmo de la solución.


                                          17
¿Cuándo usar recursividad?
    Para simplificar el código.
    Cuando la estructura de datos es recursiva
    ejemplo : árboles.

¿Cuándo no usar recursividad?
    Cuando los métodos usen arreglos largos.
    Cuando el método cambia de manera
    impredecible de campos.
    Cuando las iteraciones sean la mejor opción.
                                                    18
Algunas Definiciones.

   Cuando un procedimiento incluye una
    llamada a sí mismo se conoce como
    recursión directa.




                                          19
Algunas Definiciones.

   Cuando un procedimiento llama a otro
    procedimiento    y    éste    causa   que    el
    procedimiento original sea invocado, se conoce
    como recursión indirecta.


NOTA: Cuando un procedimiento recursivo se llama recursivamente a
  si mismo varias veces, para cada llamada se crean copias
  independientes de las variables declaradas en el procedimiento.


                                                               20
Recursión vs. iteración
Repetición
   Iteración: ciclo explícito
   Recursión: repetidas invocaciones a método
Terminación
   Iteración: el ciclo termina o la condición del ciclo
     falla
   Recursión: se reconoce el caso base

En ambos casos podemos tener ciclos infinitos
Considerar que resulta más positivo para cada problema
la elección entre eficiencia (iteración) o una buena
ingeniería de software, La recursión resulta normalmente
más natural.
                                                          21
Otros Ejemplos de recursividad:
   Inversión de una cadena

estática Cad invierte (Cad cadena, int limIzq, int
  limDer)
  si limDer = limIzq entonces regresa cadena
  sino     regresa invierte (cadena, limDer,
  limIzq+1) + cadena [limIzq]
  fin

                                                22
Otros Ejemplo de recursividad:

Palíndromos

Un palíndromo es una cadena que se lee (se
escribe, en este caso) igual de izquierda a
derecha que de derecha a izquierda. Escribir una
función que determine cuando una cadena es o no
un palíndromo.


                                              23
Solución
estática bool palindrome (Cad c, int limIzq, int limDer)
    si limIzq > limDer entonces
        regresa verdadero
    sino
        si c [limIzq] = c [limDer] entonces
                regresa palindrome (c, limIzq+1, limDer-1)
        sino regresa falso
    fin



                                                             24
Ejemplo: Serie de Fibonacci
Valores: 0, 1, 1, 2, 3, 5, 8...
Cada término de la serie suma los 2 anteriores. Fórmula recursiva
fib(n) = fib (n - 1) + fib (n - 2)


Caso base:      Fib (0)=0; Fib (1)=1
Caso recursivo: Fib (i) = Fib (i -1) + Fib(i -2)

public static int fib(int n){
   if (n <= 1) return n;      //condición base
        else
 return fib(n-1)+fib(n-2); //condición recursiva
}
                                                                    25
Ejemplo: Serie de Fibonacci
 Traza del cálculo recursivo
                      Fib(3)


         return   Fib(2)       +   Fib(1)


 return Fib(1) + Fib(0)              return 1


   return 1           return 0

                                                26
Trampas sutiles: Código ineficiente.
public int fib (int n)         public int fib (int n)
{                              {
  if (n < 2)                     int f1 = 1, f2 = 1, nuevo;
      return 1;                  while (n > 2)
  else                           {
      return fib (n-2) +            nuevo = f1 + f2;
                 fib ( n-1);        f1 = f2; f2 = nuevo;
}                                   n--;
                                 }
                                 return f2;
   fib (100) toma 50 años      }   fib (100) toma tan sólo
   en dar el resultado             unos microsegundos en
                                   dar el resultado
                                                           27
Serie fibonacci Iteración vs recursión
  70                                      iteraciones
                                          recursividad
  60

  50

  40

  30

  20

  10

   0
        0   10   20   30   40   50   60
  -10
                                                 28
Un ejemplo clásico de recursividad:
Torres de Hanoi




           A           B              C
                                          29
Torres de Hanoi
   Tenemos tres astas A, B y C, y un conjunto
    de cinco aros, todos de distintos tamaños.
   El enigma comienza con todos los aros
    colocados en el asta A de tal forma que
    ninguno de ellos debe estar sobre uno más
    pequeño a él; es decir, están apilados, uno
    sobre el otro, con el más grande hasta abajo,
    encima de él, el siguiente en tamaño y así
    sucesivamente.



                                                    30
Torres de Hanoi
   El propósito del enigma es lograr apilar los cincos
    aros, en el mismo orden, pero en el hasta C.
   Una restricción es que durante el proceso,
    puedes colocar los aros en cualquier asta, pero
    debe apegarse a las siguientes reglas:
     Solo puede mover el aro superior de cualquiera de las
      astas.
     Un aro más grande nunca puede estar encima de uno
      más pequeño.




                                                          31
¿Cómo resolvemos el problema?

   Para encontrar cómo se resolvería este
    problema, debemos ir viendo cómo se
    resolvería cada caso.




    http://personal4.iddeo.es/estaran/artiludi/pinacote/magritte/magritte.html
                                                                                 32
¿Cómo se resolvería el caso en
que hubiera un aro?




        A               B                C

         Pasando directamente el aro de A a C.

                                                 33
¿Cómo se resolvería el caso en
que hubiera 2 aros?




            A               B                 C
    Colocando el más pequeño en el asta B, pasando el
    grande a el asta C y después moviendo el que está
    en B a C.
                                                        34
¿Cómo se resolvería el caso de 3
aros?




         A       B         C




                                   35
Resolviendo el problema de las Torres
    de Hanoi
   Entonces, por lo que hemos podido ver, el programa
    podría definirse de la siguiente manera:
      Si es un solo disco, lo movemos de A a C.
      En otro caso, suponiendo que n es la cantidad de
       aros que hay que mover
         Movemos los n-1 aros superiores - es decir, sin
          contar el más grande- de A a B (utilizando a C
          como auxiliar).
         Movemos el último aro (el más grande) de A a
          C.
         Movemos los aros que quedaron en B a C
          (utilizando a A como auxiliar).             36
“Dividir para vencer”
   Muchas veces es posible dividir un problema en
    subproblemas más pequeños, generalmente del
    mismo tamaño, resolver los subproblemas y
    entonces combinar sus soluciones para obtener la
    solución del problema original.

   Dividir para vencer es una técnica natural para las
    estructuras de datos, ya que por definición están
    compuestas por piezas. Cuando una estructura de
    tamaño finito se divide, las últimas piezas ya no
    podrán ser divididas.


                                                     37
Ejemplo:
Encontrar el número mayor de un arreglo de enteros:

estática int mayor1 (objeto [ ] A, int limIzq, int limDer)
si limIzq = limDer entonces ;
   regresa A[limIzq]
sino
       m = (limIzq + limDer) / 2
       mayorIzq = mayor1 (A, limIzq, m)
       mayorDer = mayor1 (A, m +1, limDer)
       si mayorIzq > mayorDer entonces
             regresa mayorIzq
       sino regresa mayorDer
       finsi
finsi
                                                        38
Búsqueda Binaria (buscar un valor en un arreglo)
estática bool busbin (int[ ] A, int limIzq, int
  limDer, objeto valor)
si limIzq = limDer entonces
  regresa A[limDer]== (valor)
Sino
  m  (limIzq + limDer) / 2
  si A[m]==(valor)entonces regresa verdadero
  sino
       si valor > (A[m]) entonces
           regresa BusBin (A,m+1,limDer, valor)
       sino regresa BusBin (A,limIzq,m-1, valor)
  fin
fin

                                                   39
Tarea
   Función de Ackerman

ACK(0, n) = n+1;                     n>= 0

ACK(m, 0) = ACK(m-1, 1);             m>0

ACK(m, n) = ACK(m-1, ACK(m, n-1));   m>0, n>0


                                             40

Más contenido relacionado

La actualidad más candente

Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.
Giancarlo Aguilar
 
Notación infija postfija
Notación infija postfijaNotación infija postfija
Notación infija postfija
Omarzingm
 
Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1
Osiris Mirerus
 

La actualidad más candente (20)

Pilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datosPilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datos
 
Recursividad directa e indirecta
Recursividad directa e indirectaRecursividad directa e indirecta
Recursividad directa e indirecta
 
Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.Componentes y Librerías - Tópicos avanzados de programación.
Componentes y Librerías - Tópicos avanzados de programación.
 
automatas finitos
 automatas finitos automatas finitos
automatas finitos
 
Notación infija postfija
Notación infija postfijaNotación infija postfija
Notación infija postfija
 
Estructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de OrdenamientoEstructura de Datos Unidad - V: Métodos de Ordenamiento
Estructura de Datos Unidad - V: Métodos de Ordenamiento
 
Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1Alfabetos-Lenguajes y Automatas 1
Alfabetos-Lenguajes y Automatas 1
 
Métodos de ordenación externa
Métodos de ordenación externaMétodos de ordenación externa
Métodos de ordenación externa
 
Ingenieria de requisitos y requerimientos
Ingenieria de requisitos y requerimientosIngenieria de requisitos y requerimientos
Ingenieria de requisitos y requerimientos
 
Analisis de algoritmos complejidad en tiempo y espacio
Analisis de algoritmos complejidad en tiempo y espacioAnalisis de algoritmos complejidad en tiempo y espacio
Analisis de algoritmos complejidad en tiempo y espacio
 
ejemplos de pruebas unitarias y de integracion
ejemplos de pruebas unitarias y de integracion ejemplos de pruebas unitarias y de integracion
ejemplos de pruebas unitarias y de integracion
 
Modelo de 5 estados para sistemas operativos
Modelo de 5 estados para sistemas operativosModelo de 5 estados para sistemas operativos
Modelo de 5 estados para sistemas operativos
 
Cuadro sinóptico estructuras de datos y su clasificación
Cuadro sinóptico   estructuras de datos y su clasificaciónCuadro sinóptico   estructuras de datos y su clasificación
Cuadro sinóptico estructuras de datos y su clasificación
 
Estructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no linealesEstructura de Datos - Unidad 4 Estructuras no lineales
Estructura de Datos - Unidad 4 Estructuras no lineales
 
Colas en programacion
Colas en programacionColas en programacion
Colas en programacion
 
control de concurrencia
control de concurrenciacontrol de concurrencia
control de concurrencia
 
Listas doblemente enlazadas
Listas doblemente enlazadasListas doblemente enlazadas
Listas doblemente enlazadas
 
Búsqueda secuencial y binaria
Búsqueda secuencial y binariaBúsqueda secuencial y binaria
Búsqueda secuencial y binaria
 
Estructura de Datos -Unidad III: Estructuras Lineales
Estructura de Datos -Unidad III: Estructuras LinealesEstructura de Datos -Unidad III: Estructuras Lineales
Estructura de Datos -Unidad III: Estructuras Lineales
 
Diseño de sistemas
Diseño de sistemasDiseño de sistemas
Diseño de sistemas
 

Destacado

Estructura de Datos: Recursividad
Estructura de Datos: RecursividadEstructura de Datos: Recursividad
Estructura de Datos: Recursividad
Yanahui Bc
 
Unidad 4 est. dat. recursividad
Unidad 4  est. dat. recursividadUnidad 4  est. dat. recursividad
Unidad 4 est. dat. recursividad
rehoscript
 
Programación Modular
Programación ModularProgramación Modular
Programación Modular
guestefc95b
 
Algoritmos recursivos
Algoritmos recursivosAlgoritmos recursivos
Algoritmos recursivos
feytho
 
Programación Modular y Estructyrada
Programación Modular y EstructyradaProgramación Modular y Estructyrada
Programación Modular y Estructyrada
guestefc95b
 
Complemento a recursividad
Complemento a recursividadComplemento a recursividad
Complemento a recursividad
felipe190
 
R E L A C I O N E S D E R E C U R R E N C I A
R E L A C I O N E S  D E  R E C U R R E N C I AR E L A C I O N E S  D E  R E C U R R E N C I A
R E L A C I O N E S D E R E C U R R E N C I A
jhonricardo
 

Destacado (20)

6.funciones y recursividad en c++
6.funciones y recursividad en c++6.funciones y recursividad en c++
6.funciones y recursividad en c++
 
RECURSIVIDAD C++
RECURSIVIDAD C++RECURSIVIDAD C++
RECURSIVIDAD C++
 
Estructura de Datos: Recursividad
Estructura de Datos: RecursividadEstructura de Datos: Recursividad
Estructura de Datos: Recursividad
 
Unidad 4 est. dat. recursividad
Unidad 4  est. dat. recursividadUnidad 4  est. dat. recursividad
Unidad 4 est. dat. recursividad
 
2.1 recursividad
2.1 recursividad2.1 recursividad
2.1 recursividad
 
Programación Modular
Programación ModularProgramación Modular
Programación Modular
 
Algoritmos recursivos
Algoritmos recursivosAlgoritmos recursivos
Algoritmos recursivos
 
Programación modular
Programación modularProgramación modular
Programación modular
 
Programacion Modular
Programacion ModularProgramacion Modular
Programacion Modular
 
Programación Modular y Estructyrada
Programación Modular y EstructyradaProgramación Modular y Estructyrada
Programación Modular y Estructyrada
 
Top down
Top downTop down
Top down
 
Programación modular. Esteban Alzate Duque
Programación modular. Esteban Alzate DuqueProgramación modular. Esteban Alzate Duque
Programación modular. Esteban Alzate Duque
 
Recursividad Aplicado Al Juego
Recursividad  Aplicado Al JuegoRecursividad  Aplicado Al Juego
Recursividad Aplicado Al Juego
 
Complemento a recursividad
Complemento a recursividadComplemento a recursividad
Complemento a recursividad
 
Programación pararelo
Programación parareloProgramación pararelo
Programación pararelo
 
Procesamiento en paralelo
Procesamiento en paraleloProcesamiento en paralelo
Procesamiento en paralelo
 
Tema 4: Procesamiento paralelo.
Tema 4: Procesamiento paralelo.Tema 4: Procesamiento paralelo.
Tema 4: Procesamiento paralelo.
 
Vista aérea de los lenguajes de programación
Vista aérea de los lenguajes de programaciónVista aérea de los lenguajes de programación
Vista aérea de los lenguajes de programación
 
R E L A C I O N E S D E R E C U R R E N C I A
R E L A C I O N E S  D E  R E C U R R E N C I AR E L A C I O N E S  D E  R E C U R R E N C I A
R E L A C I O N E S D E R E C U R R E N C I A
 
Sentencia, secuencia y bloque
Sentencia, secuencia y bloqueSentencia, secuencia y bloque
Sentencia, secuencia y bloque
 

Similar a Recursividad

Metodologia de la programacion recursividad
Metodologia de la programacion   recursividadMetodologia de la programacion   recursividad
Metodologia de la programacion recursividad
victdiazm
 
Programación Orientada a Objetos parte 3
Programación Orientada a Objetos  parte 3Programación Orientada a Objetos  parte 3
Programación Orientada a Objetos parte 3
Karla Silva
 
recursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptxrecursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptx
juan gonzalez
 

Similar a Recursividad (20)

Recursividad.pdf
Recursividad.pdfRecursividad.pdf
Recursividad.pdf
 
Recursividad
RecursividadRecursividad
Recursividad
 
Recursividad 100329105433-phpapp01
Recursividad 100329105433-phpapp01Recursividad 100329105433-phpapp01
Recursividad 100329105433-phpapp01
 
Funciones recursivas
Funciones recursivasFunciones recursivas
Funciones recursivas
 
03 tda1 t2018
03 tda1 t201803 tda1 t2018
03 tda1 t2018
 
Modulo4
Modulo4Modulo4
Modulo4
 
Metodologia de la programacion recursividad
Metodologia de la programacion   recursividadMetodologia de la programacion   recursividad
Metodologia de la programacion recursividad
 
Recursividad.pdf
Recursividad.pdfRecursividad.pdf
Recursividad.pdf
 
2 clase 1_recursividad
2 clase 1_recursividad2 clase 1_recursividad
2 clase 1_recursividad
 
Algoritmos recursivos
Algoritmos recursivosAlgoritmos recursivos
Algoritmos recursivos
 
Programación Orientada a Objetos parte 3
Programación Orientada a Objetos  parte 3Programación Orientada a Objetos  parte 3
Programación Orientada a Objetos parte 3
 
Algoritmos y Estructura de Datos
Algoritmos y Estructura de DatosAlgoritmos y Estructura de Datos
Algoritmos y Estructura de Datos
 
2 algoritmos-1
2 algoritmos-12 algoritmos-1
2 algoritmos-1
 
2. Recursividad
2. Recursividad2. Recursividad
2. Recursividad
 
Funciones recursivas
Funciones recursivasFunciones recursivas
Funciones recursivas
 
Recursividad
RecursividadRecursividad
Recursividad
 
Recursividad
RecursividadRecursividad
Recursividad
 
Funciones recursivas en C++
Funciones recursivas en C++Funciones recursivas en C++
Funciones recursivas en C++
 
recursividad.pptx
recursividad.pptxrecursividad.pptx
recursividad.pptx
 
recursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptxrecursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptx
 

Más de PEDRO OSWALDO BELTRAN CANESSA

Más de PEDRO OSWALDO BELTRAN CANESSA (20)

Curso android studio
Curso android studioCurso android studio
Curso android studio
 
Ds 004-2017-minedu-reglamento-de-la-ley-n-29988
Ds 004-2017-minedu-reglamento-de-la-ley-n-29988Ds 004-2017-minedu-reglamento-de-la-ley-n-29988
Ds 004-2017-minedu-reglamento-de-la-ley-n-29988
 
Las 6 generaciones de computadoras
Las 6 generaciones de computadorasLas 6 generaciones de computadoras
Las 6 generaciones de computadoras
 
E economie air_france
E economie air_franceE economie air_france
E economie air_france
 
Ley reforma-magisterial-29944
Ley reforma-magisterial-29944Ley reforma-magisterial-29944
Ley reforma-magisterial-29944
 
Manual técnicas de programación pbc
Manual técnicas de programación pbcManual técnicas de programación pbc
Manual técnicas de programación pbc
 
1 gestión de_proyectos
1 gestión de_proyectos1 gestión de_proyectos
1 gestión de_proyectos
 
Curso recursividad
Curso   recursividadCurso   recursividad
Curso recursividad
 
Diseno creacion-bases-datos-completo
Diseno creacion-bases-datos-completoDiseno creacion-bases-datos-completo
Diseno creacion-bases-datos-completo
 
Mini curso de java
Mini curso de javaMini curso de java
Mini curso de java
 
Bromas informáticas
Bromas informáticasBromas informáticas
Bromas informáticas
 
Manual de microcontroladores
Manual de microcontroladoresManual de microcontroladores
Manual de microcontroladores
 
Teoría de Números
Teoría de NúmerosTeoría de Números
Teoría de Números
 
Matemática Lúdica
Matemática LúdicaMatemática Lúdica
Matemática Lúdica
 
Programacion en Java (II)
Programacion en Java (II)Programacion en Java (II)
Programacion en Java (II)
 
PROGRAMACIÓN EN JAVA (I)
PROGRAMACIÓN EN JAVA (I)PROGRAMACIÓN EN JAVA (I)
PROGRAMACIÓN EN JAVA (I)
 
PROGRAMACIÓN ORIENTADA A OBJETOS
PROGRAMACIÓN ORIENTADA A OBJETOSPROGRAMACIÓN ORIENTADA A OBJETOS
PROGRAMACIÓN ORIENTADA A OBJETOS
 
Windows 7
Windows 7Windows 7
Windows 7
 
Instalacin de-moodle-1203175408925671-3
Instalacin de-moodle-1203175408925671-3Instalacin de-moodle-1203175408925671-3
Instalacin de-moodle-1203175408925671-3
 
Introduccion a la programación orientada a objetos
Introduccion a la programación orientada a objetosIntroduccion a la programación orientada a objetos
Introduccion a la programación orientada a objetos
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Último (12)

Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 

Recursividad

  • 1. Estructuras de Datos Recursividad Ing° Pedro Beltrán Canessa 1
  • 2. Ejemplo Matrushka  La Matrushka es una artesanía tradicional rusa. Es una muñeca de madera que contiene otra muñeca más pequeña dentro de sí. Esta muñeca, también contiene otra muñeca dentro. Y así, una dentro de otra. 2
  • 3. ¿Qué es la recursividad?  La recursividad es un concepto fundamental en matemáticas y en computación.  Es una alternativa diferente para implementar estructuras de repetición (ciclos). Los módulos se hacen llamadas recursivas.  Se puede usar en toda situación en la cual la solución pueda ser expresada como una secuencia de movimientos, pasos o transformaciones gobernadas por un conjunto de reglas no ambiguas. 3
  • 4. Función recursiva Las funciones recursivas se componen de:  Caso base: una solución simple para un caso particular (puede haber más de un caso base). La secuenciación, iteración condicional y selección son estructuras válidas de control que pueden ser consideradas como enunciados. NOTA: 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. 4
  • 5. Función recursiva  Caso recursivo: una solución que involucra volver a utilizar la función original, con parámetros que se acercan más al caso base. Los pasos que sigue el caso recursivo son los siguientes: 1. El procedimiento se llama a sí mismo 2. El problema se resuelve, resolviendo el mismo problema pero de tamaño menor 3. La manera en la cual el tamaño del problema disminuye asegura que el caso base eventualmente se alcanzará 5
  • 7. Ejemplo: factorial Escribe un programa que calcule el factorial (!) de un entero no negativo. He aquí algunos ejemplos de factoriales:  0! = 1  1! = 1  2! = 2  2! = 2 * 1!  3! = 6  3! = 3 * 2!  4! = 24  4! = 4 * 3!  5! = 120  5! = 5 * 4! 7
  • 8. Ejemplo: factorial (iterativo) int factorial (int n) public int factorial (int n) { comienza int fact = 1; fact  1 for (int i = 1; i <= n; i++) para i  1 hasta n fact *= i; fact  i * fact return fact; regresa fact } termina 8
  • 9. Ejemplo: factorial (recursivo) int factorial (int n) public int factorial (int n) { comienza if n == 0 return 1; si n = 0 entonces else regresa 1 otro return factorial (n-1) * n; regresa factorial (n-1)*n } termina 9
  • 10. Ejemplo:  A continuaciòn se puede ver la secuencia de factoriales.  0! =1  1! = 1 = 1 * 1 = 1 * 0!  2! = 2 = 2 * 1 = 2 * 1!  3! = 6 = 3 * 2 = 3 * 2!  4! = 24 = 4 * 6 = 4 * 3!  5! = 120 = 5 * 24 = 5 * 4!  ...  N! = = N * (N – 1)! 10
  • 11. 11
  • 12. Solución Aquí podemos ver la secuencia que toma el factorial 1 si N = 0 (base) N! = N * (N – 1) ! si N > 0 (recursión) 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. 12
  • 13. Solución Recursiva Dado un entero no negativo x, regresar el factorial de x fact: Entrada n entero no nogativo, Salida:entero. Es importante determinar int fact (int n) un caso base, es decir un punto en el cual existe una { condición por la cual no se if (n == 0) requiera volver a llamar a la misma función. return 1; else return fact(n – 1) * n ; } 13
  • 14. ¿Cómo funciona la recursividad? Llamadas recursivas Resultados de las llamadas recursivas 14
  • 15. ¿Por qué escribir programas recursivos?  Son mas cercanos a la descripción matemática.  Generalmente mas fáciles de analizar  Se adaptan mejor a las estructuras de datos recursivas.  Los algoritmos recursivos ofrecen soluciones estructuradas, modulares y elegantemente simples. 15
  • 16. ¿Cómo escribir una función en forma recursiva? <tipo_de_regreso><nom_fnc> (<param>){ [declaración de variables] [condición de salida] [instrucciones] [llamada a <nom_fnc> (<param>)] return <resultado> } 16
  • 17. Ejercicio Considere la siguiente ecuación recurrente: an = an-1 + 2n a0 = 1 Escribe el algoritmo de la solución. 17
  • 18. ¿Cuándo usar recursividad?  Para simplificar el código.  Cuando la estructura de datos es recursiva ejemplo : árboles. ¿Cuándo no usar recursividad?  Cuando los métodos usen arreglos largos.  Cuando el método cambia de manera impredecible de campos.  Cuando las iteraciones sean la mejor opción. 18
  • 19. Algunas Definiciones.  Cuando un procedimiento incluye una llamada a sí mismo se conoce como recursión directa. 19
  • 20. Algunas Definiciones.  Cuando un procedimiento llama a otro procedimiento y éste causa que el procedimiento original sea invocado, se conoce como recursión indirecta. NOTA: Cuando un procedimiento recursivo se llama recursivamente a si mismo varias veces, para cada llamada se crean copias independientes de las variables declaradas en el procedimiento. 20
  • 21. Recursión vs. iteración Repetición Iteración: ciclo explícito Recursión: repetidas invocaciones a método Terminación Iteración: el ciclo termina o la condición del ciclo falla Recursión: se reconoce el caso base En ambos casos podemos tener ciclos infinitos Considerar que resulta más positivo para cada problema la elección entre eficiencia (iteración) o una buena ingeniería de software, La recursión resulta normalmente más natural. 21
  • 22. Otros Ejemplos de recursividad:  Inversión de una cadena estática Cad invierte (Cad cadena, int limIzq, int limDer) si limDer = limIzq entonces regresa cadena sino regresa invierte (cadena, limDer, limIzq+1) + cadena [limIzq] fin 22
  • 23. Otros Ejemplo de recursividad: Palíndromos Un palíndromo es una cadena que se lee (se escribe, en este caso) igual de izquierda a derecha que de derecha a izquierda. Escribir una función que determine cuando una cadena es o no un palíndromo. 23
  • 24. Solución estática bool palindrome (Cad c, int limIzq, int limDer) si limIzq > limDer entonces regresa verdadero sino si c [limIzq] = c [limDer] entonces regresa palindrome (c, limIzq+1, limDer-1) sino regresa falso fin 24
  • 25. Ejemplo: Serie de Fibonacci Valores: 0, 1, 1, 2, 3, 5, 8... Cada término de la serie suma los 2 anteriores. Fórmula recursiva fib(n) = fib (n - 1) + fib (n - 2) Caso base: Fib (0)=0; Fib (1)=1 Caso recursivo: Fib (i) = Fib (i -1) + Fib(i -2) public static int fib(int n){ if (n <= 1) return n; //condición base else return fib(n-1)+fib(n-2); //condición recursiva } 25
  • 26. Ejemplo: Serie de Fibonacci Traza del cálculo recursivo Fib(3) return Fib(2) + Fib(1) return Fib(1) + Fib(0) return 1 return 1 return 0 26
  • 27. Trampas sutiles: Código ineficiente. public int fib (int n) public int fib (int n) { { if (n < 2) int f1 = 1, f2 = 1, nuevo; return 1; while (n > 2) else { return fib (n-2) + nuevo = f1 + f2; fib ( n-1); f1 = f2; f2 = nuevo; } n--; } return f2; fib (100) toma 50 años } fib (100) toma tan sólo en dar el resultado unos microsegundos en dar el resultado 27
  • 28. Serie fibonacci Iteración vs recursión 70 iteraciones recursividad 60 50 40 30 20 10 0 0 10 20 30 40 50 60 -10 28
  • 29. Un ejemplo clásico de recursividad: Torres de Hanoi A B C 29
  • 30. Torres de Hanoi  Tenemos tres astas A, B y C, y un conjunto de cinco aros, todos de distintos tamaños.  El enigma comienza con todos los aros colocados en el asta A de tal forma que ninguno de ellos debe estar sobre uno más pequeño a él; es decir, están apilados, uno sobre el otro, con el más grande hasta abajo, encima de él, el siguiente en tamaño y así sucesivamente. 30
  • 31. Torres de Hanoi  El propósito del enigma es lograr apilar los cincos aros, en el mismo orden, pero en el hasta C.  Una restricción es que durante el proceso, puedes colocar los aros en cualquier asta, pero debe apegarse a las siguientes reglas:  Solo puede mover el aro superior de cualquiera de las astas.  Un aro más grande nunca puede estar encima de uno más pequeño. 31
  • 32. ¿Cómo resolvemos el problema?  Para encontrar cómo se resolvería este problema, debemos ir viendo cómo se resolvería cada caso. http://personal4.iddeo.es/estaran/artiludi/pinacote/magritte/magritte.html 32
  • 33. ¿Cómo se resolvería el caso en que hubiera un aro? A B C Pasando directamente el aro de A a C. 33
  • 34. ¿Cómo se resolvería el caso en que hubiera 2 aros? A B C Colocando el más pequeño en el asta B, pasando el grande a el asta C y después moviendo el que está en B a C. 34
  • 35. ¿Cómo se resolvería el caso de 3 aros? A B C 35
  • 36. Resolviendo el problema de las Torres de Hanoi  Entonces, por lo que hemos podido ver, el programa podría definirse de la siguiente manera:  Si es un solo disco, lo movemos de A a C.  En otro caso, suponiendo que n es la cantidad de aros que hay que mover  Movemos los n-1 aros superiores - es decir, sin contar el más grande- de A a B (utilizando a C como auxiliar).  Movemos el último aro (el más grande) de A a C.  Movemos los aros que quedaron en B a C (utilizando a A como auxiliar). 36
  • 37. “Dividir para vencer”  Muchas veces es posible dividir un problema en subproblemas más pequeños, generalmente del mismo tamaño, resolver los subproblemas y entonces combinar sus soluciones para obtener la solución del problema original.  Dividir para vencer es una técnica natural para las estructuras de datos, ya que por definición están compuestas por piezas. Cuando una estructura de tamaño finito se divide, las últimas piezas ya no podrán ser divididas. 37
  • 38. Ejemplo: Encontrar el número mayor de un arreglo de enteros: estática int mayor1 (objeto [ ] A, int limIzq, int limDer) si limIzq = limDer entonces ; regresa A[limIzq] sino m = (limIzq + limDer) / 2 mayorIzq = mayor1 (A, limIzq, m) mayorDer = mayor1 (A, m +1, limDer) si mayorIzq > mayorDer entonces regresa mayorIzq sino regresa mayorDer finsi finsi 38
  • 39. Búsqueda Binaria (buscar un valor en un arreglo) estática bool busbin (int[ ] A, int limIzq, int limDer, objeto valor) si limIzq = limDer entonces regresa A[limDer]== (valor) Sino m  (limIzq + limDer) / 2 si A[m]==(valor)entonces regresa verdadero sino si valor > (A[m]) entonces regresa BusBin (A,m+1,limDer, valor) sino regresa BusBin (A,limIzq,m-1, valor) fin fin 39
  • 40. Tarea  Función de Ackerman ACK(0, n) = n+1; n>= 0 ACK(m, 0) = ACK(m-1, 1); m>0 ACK(m, n) = ACK(m-1, ACK(m, n-1)); m>0, n>0 40