Documente Academic
Documente Profesional
Documente Cultură
Recursividad
Ejemplo Matrushka
La Matrushka es una artesana tradicional rusa. Es una mueca de madera que contiene otra mueca ms pequea dentro de s. Esta mueca, tambin contiene otra mueca dentro. Y as, una dentro de otra.
Qu es la recursividad?
La recursividad es un concepto fundamental en matemticas y en computacin. Es una alternativa diferente para implementar estructuras de repeticin (ciclos). Los mdulos se hacen llamadas recursivas. Se puede usar en toda situacin en la cual la solucin pueda ser expresada como una secuencia de movimientos, pasos o transformaciones gobernadas por un conjunto de reglas no ambiguas. Se puede usar en toda situacin en la cual la 3
Funcin recursiva
Las funciones recursivas se componen de: Caso base: una solucin simple para un caso particular (puede haber ms de un caso base). La secuenciacin, iteracin condicional y seleccin son estructuras vlidas de control que pueden ser consideradas como enunciados.
NOTA: Regla recursiva Las estructuras de control que se pueden formar combinando de manera vlida la secuenciacin, iteracin condicional y seleccin tambin son vlidos.
4
Funcin recursiva
Caso recursivo: una solucin que involucra volver a utilizar la funcin original, con parmetros que se acercan ms 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 tamao menor 3. La manera en la cual el tamao del problema disminuye asegura que el caso base eventualmente se alcanzar
5
Funcin recursiva
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 3! = 6 4! = 24 5! = 120
2! = 2 * 1! 3! = 3 * 2! 4! = 4 * 3! 5! = 5 * 4!
7
Ejemplo:
= = = = =
1 2 3 4 5
* * * * *
0! 1! 2! 3! 4!
1)!
10
11
Solucin
Aqu podemos ver la secuencia que toma el factorial
1 N! = N * (N 1) !
si N = 0 (base)
si N > 0 (recursin)
Un razonamiento recursivo tiene dos partes: la base y la regla recursiva de construccin. La base no es recursiva y es el punto tanto de partida como de terminacin de la definicin.
12
Solucin 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 ; }
Es importante determinar un caso base, es decir un punto en el cual existe una condicin por la cual no se requiera volver a llamar a la misma funcin.
13
14
15
Ejercicio
Considere la siguiente ecuacin recurrente: an = an-1 + 2n a0 = 1 Escribe el algoritmo de la solucin.
17
Cuando los mtodos usen arreglos largos. Cuando el mtodo cambia de manera impredecible de campos. Cuando las iteraciones sean la mejor opcin.
18
Algunas Definiciones.
Cuando un procedimiento incluye una llamada a s mismo se conoce como recursin directa.
19
Algunas Definiciones.
Cuando un procedimiento llama a otro procedimiento y ste causa que el procedimiento original sea invocado, se conoce como recursin 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
Terminacin
Iteracin: el ciclo termina o la condicin del ciclo falla Recursin: se reconoce el caso base
En ambos casos podemos tener ciclos infinitos Considerar que resulta ms positivo para cada problema la eleccin entre eficiencia (iteracin) o una buena ingeniera de software, La recursin resulta normalmente ms natural.
21
esttica 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
Solucin
esttica 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
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; //condicin base else return fib(n-1)+fib(n-2); //condicin recursiva }
25
return
Fib(2)
Fib(1) return 1
26
iteraciones recursividad
10
20
30
40
50
60
C
29
Torres de Hanoi
Tenemos tres astas A, B y C, y un conjunto de cinco aros, todos de distintos tamaos. El enigma comienza con todos los aros colocados en el asta A de tal forma que ninguno de ellos debe estar sobre uno ms pequeo a l; es decir, estn apilados, uno sobre el otro, con el ms grande hasta abajo, encima de l, el siguiente en tamao y as sucesivamente.
30
El propsito del enigma es lograr apilar los cincos aros, en el mismo orden, pero en el hasta C. Una restriccin es que durante el proceso, puedes colocar los aros en cualquier asta, pero debe apegarse a las siguientes reglas:
Solo
Torres de Hanoi
puede mover el aro superior de cualquiera de las astas. Un aro ms grande nunca puede estar encima de uno ms pequeo.
31
Para encontrar cmo se resolvera este problema, debemos ir viendo cmo se resolvera cada caso.
http://personal4.iddeo.es/estaran/artiludi/pinacote/magritte/magritte.html
32
Colocando el ms pequeo en el asta B, pasando el grande a el asta C y despus moviendo el que est en B a C.
34
35
Entonces, por lo que hemos podido ver, el programa podra 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 ms grande- de A a B (utilizando a C como auxiliar). Movemos el ltimo aro (el ms grande) de A a C. Movemos los aros que quedaron en B a C (utilizando a A como auxiliar). 36
Muchas veces es posible dividir un problema en subproblemas ms pequeos, generalmente del mismo tamao, resolver los subproblemas y entonces combinar sus soluciones para obtener la solucin del problema original. Dividir para vencer es una tcnica natural para las estructuras de datos, ya que por definicin estn compuestas por piezas. Cuando una estructura de tamao finito se divide, las ltimas piezas ya no podrn ser divididas.
37
Ejemplo:
Encontrar el nmero mayor de un arreglo de enteros: esttica 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
Tarea
Funcin de Ackerman
n>= 0 m>0 m>0, n>0
40