SlideShare una empresa de Scribd logo
2
Lo más leído
3
Lo más leído
8
Lo más leído
Recursividad
1
Recursividad: el concepto
• 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.
2
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).
3
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, tratando 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á
4
Ejemplo: factorial
Escribe un programa que calcule el factorial (!)
de un entero no negativo. He aquí algunos
ejemplos de factoriales:
• 1! = 1
• 2! = 2  2 * 1
• 3! = 6  3 * 2 * 1
• 4! = 24  4 * 3 * 2 * 1
• 5! = 120  5 * 4 * 3 * 2 * 1
5
Ejemplo: factorial (iterativo-repetetitivo)
public int factorial (int n) {
int fact = 1;
for (int i = 1; i <= n; i++)
fact = i * fact;
return fact;
}
6
int factorial (int n)
comienza
fact  1
para i  1 hasta n
fact  i * fact
regresa fact
termina
Ejemplo: factorial (recursivo)
int factorial (int n)
comienza
si n = 0 entonces
regresa 1
otro
regresa factorial (n-1)*n
termina
public int factorial (int n) {
if n == 0 return 1;
else
return factorial (n-1) * n;
}
7
8
Ejemplo:
 A continuación se puede ver la secuencia de
factoriales.
 0! = 1
 1! = 1
 2! = 2
 3! = 6
 4! = 24
 5! = 120
 ...
 N! =
= 1 * 1 = 1 * 0!
= 2 * 1 = 2 * 1!
= 3 * 2 * 1 = 3 * 2!
= 4 * 3 * 2 * 1 = 4 * 3!
= 5 * 4 * 3 * 2 * 1 = 5 * 4!
= N * (N – 1)!
Solución Recursiva
Dado un entero no negativo x, regresar el factorial de x fact:
Entrada n entero no negativo,
Salida: entero.
int fact (int n)
{
if (n == 0)
return 1;
else
return fact(n – 1) * n ;
}
9
Es importante
determinar un caso base,
es decir un punto en el
cual existe una condición
por la cual no se requiera
volver a llamar a la
misma función.
¿Cómo funciona la recursividad?
10
¿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.
11
Factible de utilizar recursividad
• Para simplificar el código.
• Cuando la estructura de datos es recursiva
ejemplo : árboles.
• 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. 12
No factible utilizar recursividad
Otros conceptos
• Cuando un procedimiento incluye una llamada a sí mismo se conoce
como recursión directa.
• Cuando un procedimiento llama a otro procedimiento y éste causa que
el procedimiento original sea invocado, se conoce como recursión
indirecta.
13
Recursión vs iteración
Repetición
Iteración: ciclo explícito (se expresa claramente)
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 RECURSIVIDAD SE DEBE USAR CUANDO SEA REALMENTE
NECESARIA, ES DECIR, CUANDO NO EXISTA UNA SOLUCIÓN
ITERATIVA SIMPLE.
14
Backtracking
• Backtracking (o búsqueda atrás) es una técnica de programación
para hacer búsqueda sistemática a través de todas las
configuraciones posibles dentro de un espacio de búsqueda.
• Para lograr esto, los algoritmos de tipo backtracking construyen
posibles soluciones candidatas de manera sistemática.
• A veces los algoritmos de tipo backtracking se usan para encontrar
una solución, pero otras veces interesa que las revisen todas (por
ejemplo, para encontrar la más corta).
• En general, dado una solución candidatas:
• 1. Verifican si s es solución. Si lo es, hacen algo con ella (depende
del problema).
• 2. Construyen todas las posibles extensiones de s, e invocan
recursivamente al algoritmo con todas ellas.
15
16
• 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.
17
Dividir para vencer
18
• Por el hecho de usar un diseño recursivo, los algoritmos diseñados
mediante la técnica de Divide y Vencerás van a heredar las ventajas
e inconvenientes que la recursión plantea:
• Por un lado el diseño que se obtiene suele ser simple, claro, robusto y
elegante, lo que da lugar a una mayor legibilidad y facilidad
de depuración y mantenimiento del código obtenido.
• Por contra, los diseños recursivos conllevan normalmente un mayor tiempo
de ejecución que los iterativos, además de la complejidad espacial que
puede representar el uso de la pila de recursión.
• Sin embargo, este tipo de algoritmos también se pueden implementar
como un algoritmo no recursivo que almacene las soluciones
parciales en una estructura de datos explícita, como puede ser
una pila, cola, o cola de prioridad. Esta aproximación da mayor
libertad al diseñador, de forma que se pueda escoger qué
subproblema es el que se va a resolver a continuación, lo que puede
ser importante en el caso de usar técnicas como Ramificación y
acotación o de optimización.
19
EJERCICIOS PARA REALIZAR
• Encontrar de forma recursiva el factorial de un numero y la
serie de Fibonacci
• Aplicando la teoría de Backtracking simular el juego de las
ocho reinas
20

Más contenido relacionado

DOCX
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
PPT
Backtracking
PPT
PDF
Dining Philosopher's Problem
PDF
Metodo de busqueda
DOCX
Serie de taylor
PPTX
Sleeping barber problem
PPTX
While y do while
Informe técnico Unidad 4 Estructuras no lineales (Rubí Verónica)
Backtracking
Dining Philosopher's Problem
Metodo de busqueda
Serie de taylor
Sleeping barber problem
While y do while

La actualidad más candente (20)

PDF
Fasciculo 4
PPT
Recursividad
PPTX
Polimorfismo ppt
PPTX
Estructura de Datos - Unidad 6 Metodos de busqueda
PPTX
Caracteristicas de C Sharp
PPTX
deadlock handling
PDF
Operating Systems - Process Synchronization and Deadlocks
PPTX
Método de Vuelta Atrás (Backtracking)
DOCX
Recursividad
PDF
Tema 4 4. ECUACIONES DIFERENCIALES LINEALES Y SISTEMAS DE ECUACIONES
DOC
Algoritmo metodo quicksort
PPTX
Unidad 3 administracion de memoria(recoplilacion de todas las exposiciones)
PDF
Técnicas de administración del planificador
PPTX
Backtracking
DOCX
Metodos de programcion no lineal
PDF
Método numéricos para diferenciación e integración.
PDF
Unidad3 metodo simplex
PPTX
Algoritmo De Productos Medios
PDF
Reporte metodos de busqueda y ordenamiento
PPTX
Ordenamiento en C++
Fasciculo 4
Recursividad
Polimorfismo ppt
Estructura de Datos - Unidad 6 Metodos de busqueda
Caracteristicas de C Sharp
deadlock handling
Operating Systems - Process Synchronization and Deadlocks
Método de Vuelta Atrás (Backtracking)
Recursividad
Tema 4 4. ECUACIONES DIFERENCIALES LINEALES Y SISTEMAS DE ECUACIONES
Algoritmo metodo quicksort
Unidad 3 administracion de memoria(recoplilacion de todas las exposiciones)
Técnicas de administración del planificador
Backtracking
Metodos de programcion no lineal
Método numéricos para diferenciación e integración.
Unidad3 metodo simplex
Algoritmo De Productos Medios
Reporte metodos de busqueda y ordenamiento
Ordenamiento en C++
Publicidad

Similar a 2. Recursividad (20)

PPT
Recursividad
PPT
Recursividad-Analisis de Algoritmos .ppt
PDF
Recursividad.pdf
PPTX
Recursividad 100329105433-phpapp01
DOCX
Recursividad
PPTX
Recursividad
PDF
Tema_02_Divide_and_Conquhdjskakqoker.pdf
PPT
Unidad 2 p1
PDF
Recursividad.pdf
PPT
Recursividad
PPT
recursividadexposicion1-090727182853-phpapp01.ppt
PPT
Tecnicas de Recursividad_Programacion.ppt
PPT
Presentación de Recursividad para Estructuras de datos.ppt
DOC
Unidad 4 est. dat. recursividad
PPTX
recursividad.pptx
PPTX
recursividad EN PROGRAMACION ORIENTADA .pptx
DOCX
Recursividad2019
PPTX
Optimizacion
Recursividad
Recursividad-Analisis de Algoritmos .ppt
Recursividad.pdf
Recursividad 100329105433-phpapp01
Recursividad
Recursividad
Tema_02_Divide_and_Conquhdjskakqoker.pdf
Unidad 2 p1
Recursividad.pdf
Recursividad
recursividadexposicion1-090727182853-phpapp01.ppt
Tecnicas de Recursividad_Programacion.ppt
Presentación de Recursividad para Estructuras de datos.ppt
Unidad 4 est. dat. recursividad
recursividad.pptx
recursividad EN PROGRAMACION ORIENTADA .pptx
Recursividad2019
Optimizacion
Publicidad

Más de Fernando Solis (20)

PDF
fundamentos de programación el arte de programar
PDF
2.5 PROYECTOS DE POO
PDF
24.3.3. Strategy
PDF
TEMPLAT E
PDF
Patrón Singleton
PDF
Tipos de Patrones
PDF
Importancia de los patrones de diseño
PDF
Introduccion-a-los-Patrones-de-Comportamiento.pdf
PDF
Bajo acoplamiento.pdf
PDF
MODULARIDAD _AltaCohesion
PDF
Localización de decisiones de diseño
PDF
Código entendible, flexible y mantenible
PDF
22.5 Dependency Inversion
PDF
Segregación de Interfaces
PDF
Sustitución de Liskov
PDF
Principio Open-Closed Mantilla
PDF
Principio-de-Responsabilidad-Unica-en-Java
PDF
21.7 Integración de componentes gráficos y clases
PDF
21.6 Gestion de Eventos - Componentes y Objetos Gráficos Java
PDF
21.5 Tablas - Componentes y Objetos Gráficos Java
fundamentos de programación el arte de programar
2.5 PROYECTOS DE POO
24.3.3. Strategy
TEMPLAT E
Patrón Singleton
Tipos de Patrones
Importancia de los patrones de diseño
Introduccion-a-los-Patrones-de-Comportamiento.pdf
Bajo acoplamiento.pdf
MODULARIDAD _AltaCohesion
Localización de decisiones de diseño
Código entendible, flexible y mantenible
22.5 Dependency Inversion
Segregación de Interfaces
Sustitución de Liskov
Principio Open-Closed Mantilla
Principio-de-Responsabilidad-Unica-en-Java
21.7 Integración de componentes gráficos y clases
21.6 Gestion de Eventos - Componentes y Objetos Gráficos Java
21.5 Tablas - Componentes y Objetos Gráficos Java

Último (20)

PDF
Como Potenciar las Emociones Positivas y Afrontar las Negativas Ccesa007.pdf
DOCX
PLANES DE área ciencias naturales y aplicadas
PPTX
MATEMATICAS GEOMETRICA USO TRANSPORTADOR
PPTX
Clase 3 del silabo-gestion y control financiero
PDF
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...
PDF
Ernst Cassirer - Antropologia Filosofica.pdf
PDF
MATERIAL DIDÁCTICO 2023 SELECCIÓN 1_REFORZAMIENTO 1° BIMESTRE_COM.pdf
PDF
Tomo 1 de biologia gratis ultra plusenmas
PDF
Los10 Mandamientos de la Actitud Mental Positiva Ccesa007.pdf
PDF
ACERTIJO EL CONJURO DEL CAZAFANTASMAS MATEMÁTICO. Por JAVIER SOLIS NOYOLA
PPTX
TEMA 1ORGANIZACIÓN FUNCIONAL DEL CUERPO, MEDIO INTERNO Y HOMEOSTASIS (3) [Aut...
PDF
La Formacion Universitaria en Nuevos Escenarios Ccesa007.pdf
PDF
2.0 Introduccion a processing, y como obtenerlo
PDF
EL aprendizaje adaptativo bajo STEM+H.pdf
PDF
Introducción a la historia de la filosofía
PDF
Aqui No Hay Reglas Hastings-Meyer Ccesa007.pdf
PDF
TOMO II - LITERATURA.pd plusenmas ultras
PDF
La Inteligencia Emocional - Fabian Goleman TE4 Ccesa007.pdf
PPTX
Presentación de la Cetoacidosis diabetica.pptx
DOCX
Programa_Sintetico_Fase_4.docx 3° Y 4°..
Como Potenciar las Emociones Positivas y Afrontar las Negativas Ccesa007.pdf
PLANES DE área ciencias naturales y aplicadas
MATEMATICAS GEOMETRICA USO TRANSPORTADOR
Clase 3 del silabo-gestion y control financiero
ACERTIJO Súper Círculo y la clave contra el Malvado Señor de las Formas. Por ...
Ernst Cassirer - Antropologia Filosofica.pdf
MATERIAL DIDÁCTICO 2023 SELECCIÓN 1_REFORZAMIENTO 1° BIMESTRE_COM.pdf
Tomo 1 de biologia gratis ultra plusenmas
Los10 Mandamientos de la Actitud Mental Positiva Ccesa007.pdf
ACERTIJO EL CONJURO DEL CAZAFANTASMAS MATEMÁTICO. Por JAVIER SOLIS NOYOLA
TEMA 1ORGANIZACIÓN FUNCIONAL DEL CUERPO, MEDIO INTERNO Y HOMEOSTASIS (3) [Aut...
La Formacion Universitaria en Nuevos Escenarios Ccesa007.pdf
2.0 Introduccion a processing, y como obtenerlo
EL aprendizaje adaptativo bajo STEM+H.pdf
Introducción a la historia de la filosofía
Aqui No Hay Reglas Hastings-Meyer Ccesa007.pdf
TOMO II - LITERATURA.pd plusenmas ultras
La Inteligencia Emocional - Fabian Goleman TE4 Ccesa007.pdf
Presentación de la Cetoacidosis diabetica.pptx
Programa_Sintetico_Fase_4.docx 3° Y 4°..

2. Recursividad

  • 2. Recursividad: el concepto • 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. 2
  • 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). 3
  • 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, tratando 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á 4
  • 5. Ejemplo: factorial Escribe un programa que calcule el factorial (!) de un entero no negativo. He aquí algunos ejemplos de factoriales: • 1! = 1 • 2! = 2  2 * 1 • 3! = 6  3 * 2 * 1 • 4! = 24  4 * 3 * 2 * 1 • 5! = 120  5 * 4 * 3 * 2 * 1 5
  • 6. Ejemplo: factorial (iterativo-repetetitivo) public int factorial (int n) { int fact = 1; for (int i = 1; i <= n; i++) fact = i * fact; return fact; } 6 int factorial (int n) comienza fact  1 para i  1 hasta n fact  i * fact regresa fact termina
  • 7. Ejemplo: factorial (recursivo) int factorial (int n) comienza si n = 0 entonces regresa 1 otro regresa factorial (n-1)*n termina public int factorial (int n) { if n == 0 return 1; else return factorial (n-1) * n; } 7
  • 8. 8 Ejemplo:  A continuación se puede ver la secuencia de factoriales.  0! = 1  1! = 1  2! = 2  3! = 6  4! = 24  5! = 120  ...  N! = = 1 * 1 = 1 * 0! = 2 * 1 = 2 * 1! = 3 * 2 * 1 = 3 * 2! = 4 * 3 * 2 * 1 = 4 * 3! = 5 * 4 * 3 * 2 * 1 = 5 * 4! = N * (N – 1)!
  • 9. Solución Recursiva Dado un entero no negativo x, regresar el factorial de x fact: Entrada n entero no negativo, Salida: entero. int fact (int n) { if (n == 0) return 1; else return fact(n – 1) * n ; } 9 Es importante determinar un caso base, es decir un punto en el cual existe una condición por la cual no se requiera volver a llamar a la misma función.
  • 10. ¿Cómo funciona la recursividad? 10
  • 11. ¿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. 11
  • 12. Factible de utilizar recursividad • Para simplificar el código. • Cuando la estructura de datos es recursiva ejemplo : árboles. • 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. 12 No factible utilizar recursividad
  • 13. Otros conceptos • Cuando un procedimiento incluye una llamada a sí mismo se conoce como recursión directa. • Cuando un procedimiento llama a otro procedimiento y éste causa que el procedimiento original sea invocado, se conoce como recursión indirecta. 13
  • 14. Recursión vs iteración Repetición Iteración: ciclo explícito (se expresa claramente) 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 RECURSIVIDAD SE DEBE USAR CUANDO SEA REALMENTE NECESARIA, ES DECIR, CUANDO NO EXISTA UNA SOLUCIÓN ITERATIVA SIMPLE. 14
  • 15. Backtracking • Backtracking (o búsqueda atrás) es una técnica de programación para hacer búsqueda sistemática a través de todas las configuraciones posibles dentro de un espacio de búsqueda. • Para lograr esto, los algoritmos de tipo backtracking construyen posibles soluciones candidatas de manera sistemática. • A veces los algoritmos de tipo backtracking se usan para encontrar una solución, pero otras veces interesa que las revisen todas (por ejemplo, para encontrar la más corta). • En general, dado una solución candidatas: • 1. Verifican si s es solución. Si lo es, hacen algo con ella (depende del problema). • 2. Construyen todas las posibles extensiones de s, e invocan recursivamente al algoritmo con todas ellas. 15
  • 16. 16
  • 17. • 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. 17 Dividir para vencer
  • 18. 18
  • 19. • Por el hecho de usar un diseño recursivo, los algoritmos diseñados mediante la técnica de Divide y Vencerás van a heredar las ventajas e inconvenientes que la recursión plantea: • Por un lado el diseño que se obtiene suele ser simple, claro, robusto y elegante, lo que da lugar a una mayor legibilidad y facilidad de depuración y mantenimiento del código obtenido. • Por contra, los diseños recursivos conllevan normalmente un mayor tiempo de ejecución que los iterativos, además de la complejidad espacial que puede representar el uso de la pila de recursión. • Sin embargo, este tipo de algoritmos también se pueden implementar como un algoritmo no recursivo que almacene las soluciones parciales en una estructura de datos explícita, como puede ser una pila, cola, o cola de prioridad. Esta aproximación da mayor libertad al diseñador, de forma que se pueda escoger qué subproblema es el que se va a resolver a continuación, lo que puede ser importante en el caso de usar técnicas como Ramificación y acotación o de optimización. 19
  • 20. EJERCICIOS PARA REALIZAR • Encontrar de forma recursiva el factorial de un numero y la serie de Fibonacci • Aplicando la teoría de Backtracking simular el juego de las ocho reinas 20