SlideShare ist ein Scribd-Unternehmen logo
1 von 41
Downloaden Sie, um offline zu lesen
Programación Orientada a Objetos
parte 3
Recursividad
Mtra. Karla Silva R 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.
2Mtra. Karla Silva R
¿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.
3Mtra. Karla Silva R
• Es una técnica de programación que nos permite que un
bloque de instrucciones se ejecute n veces. Remplaza
en ocasiones a estructuras repetitivas.
• Este concepto será de gran utilidad para el capítulo de la
estructura de datos tipo árbol.
• La recursividad es un concepto difícil de entender en
principio, pero luego de analizar diferentes problemas
aparecen puntos comunes.
4Mtra. Karla Silva R
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.
5Mtra. Karla Silva R
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á
6Mtra. Karla Silva R
Función recursiva
7
=
+
Mtra. Karla Silva R
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!
8Mtra. Karla Silva R
Ejemplo: factorial (iterativo)
public int factorial (int n) {
int fact = 1;
for (int i = 1; i <= n; i++)
fact *= i;
return fact;
}
9
int factorial (int n)
comienza
fact  1
para i  1 hasta n
fact  i * fact
regresa fact
termina
Mtra. Karla Silva R
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;
}
10Mtra. Karla Silva R
11
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 = 3 * 2!
= 4 * 6 = 4 * 3!
= 5 * 24 = 5 * 4!
= N * (N – 1)!
Mtra. Karla Silva R
12Mtra. Karla Silva R
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.
13
Solución
Mtra. Karla Silva R
Solución Recursiva
Dado un entero no negativo x, regresar el factorial de x fact:
Entrada n entero no nogativo,
Salida:entero.
int fact (int n)
{
if (n == 0)
return 1;
else
return fact(n – 1) * n ;
}
14
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.
Mtra. Karla Silva R
¿Cómo funciona la recursividad?
15
Llamadas recursivas
Resultados de las llamadas recursivas
Mtra. Karla Silva R
¿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.
16Mtra. Karla Silva R
¿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>
}
17Mtra. Karla Silva R
Ejercicio
Considere la siguiente ecuación recurrente:
an = an-1 + 2n
a0 = 1
Escribe el algoritmo de la solución.
18Mtra. Karla Silva R
¿Cuándo usar 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.
19
¿Cuándo no usar recursividad?
Mtra. Karla Silva R
Algunas Definiciones.
• Cuando un procedimiento incluye una
llamada a sí mismo se conoce como
recursión directa.
20Mtra. Karla Silva R
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.
21Mtra. Karla Silva R
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.
22Mtra. Karla Silva R
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
23Mtra. Karla Silva R
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.
24Mtra. Karla Silva R
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
25Mtra. Karla Silva R
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
} 26Mtra. Karla Silva R
Ejemplo: Serie de Fibonacci
Traza del cálculo recursivo
27
Fib(1)return
Fib(3)
Fib(2) +
return 1Fib(0)return Fib(1) +
return 1 return 0
Mtra. Karla Silva R
Trampas sutiles: Código ineficiente.
28
public int fib (int n)
{
if (n < 2)
return 1;
else
return fib (n-2) +
fib ( n-1);
}
public int fib (int n)
{
int f1 = 1, f2 = 1, nuevo;
while (n > 2)
{
nuevo = f1 + f2;
f1 = f2; f2 = nuevo;
n--;
}
return f2;
}fib (100) toma 50 años
en dar el resultado
fib (100) toma tan sólo
unos microsegundos en
dar el resultado
Mtra. Karla Silva R
Serie fibonacci Iteración vs recursión
-10
0
10
20
30
40
50
60
70
0 10 20 30 40 50 60
iteraciones
recursividad
29Mtra. Karla Silva R
Un ejemplo clásico de recursividad:
Torres de Hanoi
30
A B C
Mtra. Karla Silva R
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.
31Mtra. Karla Silva R
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.
32Mtra. Karla Silva R
¿Cómo resolvemos el problema?
• Para encontrar cómo se resolvería este
problema, debemos ir viendo cómo se
resolvería cada caso.
33http://personal4.iddeo.es/estaran/artiludi/pinacote/magritte/magritte.htmlMtra. Karla Silva R
¿Cómo se resolvería el caso en
que hubiera un aro?
34
Pasando directamente el aro de A a C.
A B C
Mtra. Karla Silva R
¿Cómo se resolvería el caso en
que hubiera 2 aros?
35
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.
A B C
Mtra. Karla Silva R
¿Cómo se resolvería el caso de 3
aros?
36
A B C
Mtra. Karla Silva R
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). 37Mtra. Karla Silva R
“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.
38Mtra. Karla Silva R
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
39Mtra. Karla Silva R
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
40Mtra. Karla Silva R
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
41Mtra. Karla Silva R

Weitere ähnliche Inhalte

Was ist angesagt?

Estructura de Datos: Recursividad
Estructura de Datos: RecursividadEstructura de Datos: Recursividad
Estructura de Datos: Recursividad
Yanahui Bc
 
Algoritmos recursivos
Algoritmos recursivosAlgoritmos recursivos
Algoritmos recursivos
feytho
 
Capítulo 7 sincronización de procesos 09 01-2012
Capítulo 7 sincronización de procesos 09 01-2012Capítulo 7 sincronización de procesos 09 01-2012
Capítulo 7 sincronización de procesos 09 01-2012
ecuatareas
 
Unidad 4 est. dat. recursividad
Unidad 4  est. dat. recursividadUnidad 4  est. dat. recursividad
Unidad 4 est. dat. recursividad
rehoscript
 

Was ist angesagt? (20)

Recursividad
RecursividadRecursividad
Recursividad
 
Recursividad
RecursividadRecursividad
Recursividad
 
Estructura de Datos: Recursividad
Estructura de Datos: RecursividadEstructura de Datos: Recursividad
Estructura de Datos: Recursividad
 
Algoritmos recursivos
Algoritmos recursivosAlgoritmos recursivos
Algoritmos recursivos
 
Recursividad
RecursividadRecursividad
Recursividad
 
Algoritmos recursivos
Algoritmos recursivosAlgoritmos recursivos
Algoritmos recursivos
 
Tema no. 1
Tema no. 1Tema no. 1
Tema no. 1
 
Divide y Venceras
Divide y VencerasDivide y Venceras
Divide y Venceras
 
Algoritmos
AlgoritmosAlgoritmos
Algoritmos
 
Recursividad directa e indirecta
Recursividad directa e indirectaRecursividad directa e indirecta
Recursividad directa e indirecta
 
Divide y Vencerás
Divide y VencerásDivide y Vencerás
Divide y Vencerás
 
Algoritmos divide y vencerás
Algoritmos divide y vencerásAlgoritmos divide y vencerás
Algoritmos divide y vencerás
 
Capítulo 7 sincronización de procesos 09 01-2012
Capítulo 7 sincronización de procesos 09 01-2012Capítulo 7 sincronización de procesos 09 01-2012
Capítulo 7 sincronización de procesos 09 01-2012
 
Sección 3.6 Trnasformada Z unilateral
Sección 3.6 Trnasformada Z unilateralSección 3.6 Trnasformada Z unilateral
Sección 3.6 Trnasformada Z unilateral
 
Solucion taller 1 de control 2
Solucion taller 1 de control 2Solucion taller 1 de control 2
Solucion taller 1 de control 2
 
Tecnicas de integracion matematica i uney
Tecnicas de integracion matematica i uneyTecnicas de integracion matematica i uney
Tecnicas de integracion matematica i uney
 
Unidad 4 est. dat. recursividad
Unidad 4  est. dat. recursividadUnidad 4  est. dat. recursividad
Unidad 4 est. dat. recursividad
 
Control de trayectoria de manipulador robótico de
Control de trayectoria de manipulador robótico de Control de trayectoria de manipulador robótico de
Control de trayectoria de manipulador robótico de
 
2. Recursividad
2. Recursividad2. Recursividad
2. Recursividad
 
Unidad 3 c5-control/ANALISIS DE LA RESPUESTA EN EL TIEMPO
Unidad 3 c5-control/ANALISIS DE LA RESPUESTA EN EL TIEMPOUnidad 3 c5-control/ANALISIS DE LA RESPUESTA EN EL TIEMPO
Unidad 3 c5-control/ANALISIS DE LA RESPUESTA EN EL TIEMPO
 

Andere mochten auch (7)

12 Solucion De Problemas Con Recursion
12 Solucion De Problemas Con Recursion12 Solucion De Problemas Con Recursion
12 Solucion De Problemas Con Recursion
 
11 Recursion
11 Recursion11 Recursion
11 Recursion
 
Tema 1 Recursión
Tema 1 RecursiónTema 1 Recursión
Tema 1 Recursión
 
Estructura de datos unidad 6
Estructura de datos unidad 6Estructura de datos unidad 6
Estructura de datos unidad 6
 
Recursividad
RecursividadRecursividad
Recursividad
 
Estructura de datos
Estructura de datosEstructura de datos
Estructura de datos
 
Estructuras en C
Estructuras en CEstructuras en C
Estructuras en C
 

Ähnlich wie Programación Orientada a Objetos parte 3 (20)

Recursividad.pdf
Recursividad.pdfRecursividad.pdf
Recursividad.pdf
 
Recursividad
RecursividadRecursividad
Recursividad
 
Recursividad.pdf
Recursividad.pdfRecursividad.pdf
Recursividad.pdf
 
Matematicas para la Olimpiada
Matematicas para la OlimpiadaMatematicas para la Olimpiada
Matematicas para la Olimpiada
 
Recursividad
RecursividadRecursividad
Recursividad
 
Catalan
CatalanCatalan
Catalan
 
Catalan
CatalanCatalan
Catalan
 
Catalan
CatalanCatalan
Catalan
 
Catalan
CatalanCatalan
Catalan
 
N cap 5 numeros
N cap 5 numerosN cap 5 numeros
N cap 5 numeros
 
Cap 5 numeros
Cap 5 numerosCap 5 numeros
Cap 5 numeros
 
Unidad 2 p1
Unidad 2 p1Unidad 2 p1
Unidad 2 p1
 
Metodologia de la programacion recursividad
Metodologia de la programacion   recursividadMetodologia de la programacion   recursividad
Metodologia de la programacion recursividad
 
03 tda1 t2018
03 tda1 t201803 tda1 t2018
03 tda1 t2018
 
Recursividad
RecursividadRecursividad
Recursividad
 
Cap1.1 recursividad
Cap1.1 recursividadCap1.1 recursividad
Cap1.1 recursividad
 
Actividad integradora 2
Actividad integradora 2Actividad integradora 2
Actividad integradora 2
 
Recursividad Con C#
Recursividad Con C#Recursividad Con C#
Recursividad Con C#
 
Recursividad
RecursividadRecursividad
Recursividad
 
Unidad 2
Unidad 2Unidad 2
Unidad 2
 

Mehr von Karla Silva

Taller de prog. en android
Taller de prog. en androidTaller de prog. en android
Taller de prog. en android
Karla Silva
 
Programación Orientada a Objetos parte 2
Programación Orientada a Objetos  parte 2Programación Orientada a Objetos  parte 2
Programación Orientada a Objetos parte 2
Karla Silva
 
Programación Orientada a Objetos parte 1
Programación Orientada a Objetos  parte 1Programación Orientada a Objetos  parte 1
Programación Orientada a Objetos parte 1
Karla Silva
 

Mehr von Karla Silva (18)

lnformacion General ITIL.pptx
lnformacion General ITIL.pptxlnformacion General ITIL.pptx
lnformacion General ITIL.pptx
 
lnformacion General SlE.pptx
lnformacion General SlE.pptxlnformacion General SlE.pptx
lnformacion General SlE.pptx
 
lnformacion General RV.pptx
lnformacion General RV.pptxlnformacion General RV.pptx
lnformacion General RV.pptx
 
Formato_Información general.pptx
Formato_Información general.pptxFormato_Información general.pptx
Formato_Información general.pptx
 
lnformacion General LP.pptx
lnformacion General LP.pptxlnformacion General LP.pptx
lnformacion General LP.pptx
 
Informacion general
Informacion generalInformacion general
Informacion general
 
Actividad 1.pptx
Actividad 1.pptxActividad 1.pptx
Actividad 1.pptx
 
lnformacion General ISS.pptx
lnformacion General ISS.pptxlnformacion General ISS.pptx
lnformacion General ISS.pptx
 
Inf. Gral. Aplicaciónes Móviles.pptx
Inf. Gral. Aplicaciónes Móviles.pptxInf. Gral. Aplicaciónes Móviles.pptx
Inf. Gral. Aplicaciónes Móviles.pptx
 
lnformacion General SC.pptx
lnformacion General SC.pptxlnformacion General SC.pptx
lnformacion General SC.pptx
 
Información General.pptx
Información General.pptxInformación General.pptx
Información General.pptx
 
lnformacion General ISS.pptx
lnformacion General ISS.pptxlnformacion General ISS.pptx
lnformacion General ISS.pptx
 
Inf. Gral. Criptografía.pptx
Inf. Gral. Criptografía.pptxInf. Gral. Criptografía.pptx
Inf. Gral. Criptografía.pptx
 
Presentación1
Presentación1Presentación1
Presentación1
 
Taller de prog. en android
Taller de prog. en androidTaller de prog. en android
Taller de prog. en android
 
Programación Orientada a Objetos parte 2
Programación Orientada a Objetos  parte 2Programación Orientada a Objetos  parte 2
Programación Orientada a Objetos parte 2
 
Programación Orientada a Objetos parte 1
Programación Orientada a Objetos  parte 1Programación Orientada a Objetos  parte 1
Programación Orientada a Objetos parte 1
 
Programación Orientada a Objetos Parte 1
Programación Orientada a Objetos Parte 1Programación Orientada a Objetos Parte 1
Programación Orientada a Objetos Parte 1
 

Programación Orientada a Objetos parte 3

  • 1. Programación Orientada a Objetos parte 3 Recursividad Mtra. Karla Silva R 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. 2Mtra. Karla Silva R
  • 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. 3Mtra. Karla Silva R
  • 4. • Es una técnica de programación que nos permite que un bloque de instrucciones se ejecute n veces. Remplaza en ocasiones a estructuras repetitivas. • Este concepto será de gran utilidad para el capítulo de la estructura de datos tipo árbol. • La recursividad es un concepto difícil de entender en principio, pero luego de analizar diferentes problemas aparecen puntos comunes. 4Mtra. Karla Silva R
  • 5. 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. 5Mtra. Karla Silva R
  • 6. 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á 6Mtra. Karla Silva R
  • 8. 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! 8Mtra. Karla Silva R
  • 9. Ejemplo: factorial (iterativo) public int factorial (int n) { int fact = 1; for (int i = 1; i <= n; i++) fact *= i; return fact; } 9 int factorial (int n) comienza fact  1 para i  1 hasta n fact  i * fact regresa fact termina Mtra. Karla Silva R
  • 10. 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; } 10Mtra. Karla Silva R
  • 11. 11 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 = 3 * 2! = 4 * 6 = 4 * 3! = 5 * 24 = 5 * 4! = N * (N – 1)! Mtra. Karla Silva R
  • 13. 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. 13 Solución Mtra. Karla Silva R
  • 14. Solución Recursiva Dado un entero no negativo x, regresar el factorial de x fact: Entrada n entero no nogativo, Salida:entero. int fact (int n) { if (n == 0) return 1; else return fact(n – 1) * n ; } 14 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. Mtra. Karla Silva R
  • 15. ¿Cómo funciona la recursividad? 15 Llamadas recursivas Resultados de las llamadas recursivas Mtra. Karla Silva R
  • 16. ¿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. 16Mtra. Karla Silva R
  • 17. ¿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> } 17Mtra. Karla Silva R
  • 18. Ejercicio Considere la siguiente ecuación recurrente: an = an-1 + 2n a0 = 1 Escribe el algoritmo de la solución. 18Mtra. Karla Silva R
  • 19. ¿Cuándo usar 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. 19 ¿Cuándo no usar recursividad? Mtra. Karla Silva R
  • 20. Algunas Definiciones. • Cuando un procedimiento incluye una llamada a sí mismo se conoce como recursión directa. 20Mtra. Karla Silva R
  • 21. 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. 21Mtra. Karla Silva R
  • 22. 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. 22Mtra. Karla Silva R
  • 23. 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 23Mtra. Karla Silva R
  • 24. 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. 24Mtra. Karla Silva R
  • 25. 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 25Mtra. Karla Silva R
  • 26. 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 } 26Mtra. Karla Silva R
  • 27. Ejemplo: Serie de Fibonacci Traza del cálculo recursivo 27 Fib(1)return Fib(3) Fib(2) + return 1Fib(0)return Fib(1) + return 1 return 0 Mtra. Karla Silva R
  • 28. Trampas sutiles: Código ineficiente. 28 public int fib (int n) { if (n < 2) return 1; else return fib (n-2) + fib ( n-1); } public int fib (int n) { int f1 = 1, f2 = 1, nuevo; while (n > 2) { nuevo = f1 + f2; f1 = f2; f2 = nuevo; n--; } return f2; }fib (100) toma 50 años en dar el resultado fib (100) toma tan sólo unos microsegundos en dar el resultado Mtra. Karla Silva R
  • 29. Serie fibonacci Iteración vs recursión -10 0 10 20 30 40 50 60 70 0 10 20 30 40 50 60 iteraciones recursividad 29Mtra. Karla Silva R
  • 30. Un ejemplo clásico de recursividad: Torres de Hanoi 30 A B C Mtra. Karla Silva R
  • 31. 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. 31Mtra. Karla Silva R
  • 32. 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. 32Mtra. Karla Silva R
  • 33. ¿Cómo resolvemos el problema? • Para encontrar cómo se resolvería este problema, debemos ir viendo cómo se resolvería cada caso. 33http://personal4.iddeo.es/estaran/artiludi/pinacote/magritte/magritte.htmlMtra. Karla Silva R
  • 34. ¿Cómo se resolvería el caso en que hubiera un aro? 34 Pasando directamente el aro de A a C. A B C Mtra. Karla Silva R
  • 35. ¿Cómo se resolvería el caso en que hubiera 2 aros? 35 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. A B C Mtra. Karla Silva R
  • 36. ¿Cómo se resolvería el caso de 3 aros? 36 A B C Mtra. Karla Silva R
  • 37. 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). 37Mtra. Karla Silva R
  • 38. “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. 38Mtra. Karla Silva R
  • 39. 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 39Mtra. Karla Silva R
  • 40. 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 40Mtra. Karla Silva R
  • 41. 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 41Mtra. Karla Silva R