Your SlideShare is downloading. ×
0
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Recursividad
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Recursividad

4,607

Published on

Recursividad …

Recursividad
Ing° Pedro Beltrán Canessa

3 Comments
4 Likes
Statistics
Notes
  • es muy facil de entender muy buena presentacion
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • muy buena presentación...
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • muy interesante se entiende facilmente
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total Views
4,607
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
245
Comments
3
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Estructuras de DatosRecursividadIng° 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 recursivaLas 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
  • 6. Función recursiva = + 6
  • 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ónAquí 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 laregla recursiva de construcción. La base no es recursiva yes el punto tanto de partida como de terminación de ladefinición. 12
  • 13. Solución RecursivaDado 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 formarecursiva?<tipo_de_regreso><nom_fnc> (<param>){ [declaración de variables] [condición de salida] [instrucciones] [llamada a <nom_fnc> (<param>)] return <resultado>} 16
  • 17. EjercicioConsidere la siguiente ecuación recurrente: an = an-1 + 2n a0 = 1Escribe 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ónRepetición Iteración: ciclo explícito Recursión: repetidas invocaciones a métodoTerminación Iteración: el ciclo termina o la condición del ciclo falla Recursión: se reconoce el caso baseEn ambos casos podemos tener ciclos infinitosConsiderar que resulta más positivo para cada problemala elección entre eficiencia (iteración) o una buenaingeniería de software, La recursión resulta normalmentemás natural. 21
  • 22. Otros Ejemplos de recursividad: Inversión de una cadenaestá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índromosUn palíndromo es una cadena que se lee (seescribe, en este caso) igual de izquierda aderecha que de derecha a izquierda. Escribir unafunción que determine cuando una cadena es o noun palíndromo. 23
  • 24. Soluciónestá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 FibonacciValores: 0, 1, 1, 2, 3, 5, 8...Cada término de la serie suma los 2 anteriores. Fórmula recursivafib(n) = fib (n - 1) + fib (n - 2)Caso base: Fib (0)=0; Fib (1)=1Caso 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 enque hubiera un aro? A B C Pasando directamente el aro de A a C. 33
  • 34. ¿Cómo se resolvería el caso enque 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 3aros? 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 finsifinsi 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) finfin 39
  • 40. Tarea Función de AckermanACK(0, n) = n+1; n>= 0ACK(m, 0) = ACK(m-1, 1); m>0ACK(m, n) = ACK(m-1, ACK(m, n-1)); m>0, n>0 40

×