Recursividad Con Tres Conclusiones
Recursividad Con Tres Conclusiones
Recursividad Con Tres Conclusiones
SISTEMAS COMPUTACIONALES
SEMTIEMBRE/2020
INDICE
INTRODUCCIÓN......................................................................................................................................1
2.1 RECURSIVIDAD DEFINICIÓN........................................................................................................2
2.2 PROCEDIMIENTOS RECURSIVOS...........................................................................................3
2.3 EJEMPLOS DE CASOS RECURSIVOS................................................................................4
CONCLUSIONES...................................................................................................................................12
BIBLIOGRAFÍA ..........................................................................................................................................14
INTRODUCCIÓN
En esta corta unidad se estudiarán los temas relacionados a la recursión, para una
mejor comprensión se dará una definición satisfactoria y se procederá a explicar los
tipos de recursión, seguido de algunos ejemplos en los cuales se aplica la misma, se
espera que al finalizar el documento, el lector se lleve consigo una clara idea de la
funcionalidad y el funcionamiento de la recursividad aplicada en la estructura de datos.
1
2.1 RECURSIVIDAD DEFINICIÓN
En matemáticas se da el nombre de recursión a la técnica consistente en definir una
función en términos de sí misma. Puesto que en C una función puede llamar a otras
funciones, se permite que una función también pueda llamarse a sí misma.
Cuando creamos un método recursivo debemos tener en cuenta que este tiene que
terminar por lo que dentro del método debemos asegurarnos de que no se está
llamando a si mismo todo el rato, Lo que quiere decir que el ciclo es finito.
Un problema que pueda ser definido en función de su tamaño, sea este N, pueda ser
dividido en instancias más pequeñas (< N) del mismo problema y se conozca la
solución explícita a las instancias más simples, lo que se conoce como casos base, se
puede aplicar inducción sobre las llamadas más pequeñas y suponer que estas quedan
resueltas.
Cada llamada genera una nueva llamada a una función con los correspondientes
objetos locales.
Volviéndose a ejecutar completamente, hasta la llamada a sí misma. Donde
vuelve a crear en la pila los nuevos parámetros y variables locales. Tantos como
llamadas recursivas generemos.
Al terminar, se van liberando la memoria en la pila, empezando desde la última
función creada hasta la primera, la cual será la última en liberarse.
3
iterativos, en contraposición con los procesos recursivos que generan los programas
vistos hasta ahora.
En general, las versiones iterativas son menos elegantes y más difíciles de entender
que las recursivas, pero son más eficientes.
En otros lenguajes de programación existen bucles (for, while) para definir procesos
iterativos. En un lenguaje funcional puro no existen bucles. Se utiliza uno o más
parámetros auxiliares y se modifica su valor en cada llamada a la recursión.
Esta recursión que no deja llamadas en espera también recibe el nombre de tail
recursión o recursión por la cola. El código del intérprete que evalúa la recursión por la
cola puede tratar estas llamadas de una forma especial, sabiendo que no hay que
devolver el resultado para que vuelva a ser procesado. Se devuelve el último valor a la
llamada original y se puede eliminar la pila de la llamada.
1) Secuencia Fibonacci
2) Función Factorial
3) Torres de Hanoi
4) Búsqueda Binaria
4
Esto genera un proceso recursivo en forma de árbol, como se comprueba en la
siguiente figura, extraída del Abelson & Sussman:
5
2. Función factorial: Un factorial es el productorio de k, siendo k=1 hasta n siendo n
números enteros. Un productorio es una notación matemática (una representación) de
la multiplicación de una cantidad arbitraria. Posteriormente se muestra nuevamente el
problema de la resolución de la factorial.
if (x==0) return 1;
La función anterior podría haberse escrito sin utilizar la recursividad, en forma iterativa,
del siguiente modo:
int factorial(int x)
{ int f=1;
f=f*x;
return f; }
Las dos funciones realizan el mismo cálculo utilizando las mismas operaciones, pero la
forma recursiva emplea mayor cantidad de memoria (el paso del parámetro es por
6
valor) y además existe el coste añadido ˜ de las sucesivas llamadas, las cuales
conllevan un determinado tiempo de procesador. En general una función no es
recursiva o iterativa intrínsecamente: para cada función recursiva existe una función
iterativa con su misma especificación, y viceversa. Es frecuente codificar de forma
recursiva una función cuando su versión iterativa es muy compleja.
De esto se puede deducir que según el número de discos que haya en la torre, se
podrá resolver el problema con un número de pasos mínimo que corresponde con la
siguiente relación:
7
Esto se puede hacer con la fórmula P(n) = 2^n - 1. Siendo P(n) la función y n el número
de discos (se lee 2 elevado a n, es decir, 2 multiplicado por 2, n veces, menos 1).
8
4. Búsqueda binaria.
En una búsqueda binaria se puede empezar desde el dato de en medio de una lista
ordenara para determinar si el ítem que buscamos se encuentra en la repasada central
que dimos si encontramos ese ítem, hemos terminado. Si no es el ítem correcto,
podemos utilizar la naturaleza ordenada de la lista para eliminar la mitad de los ítems
restantes. Si el ítem que buscamos es mayor que el ítem central, sabemos que toda la
mitad inferior de la lista, así como el ítem central, se pueden ignorar de la consideración
posterior. El ítem, si es que está en la lista, debe estar en la mitad superior.
2 primero = 0
3 ultimo = len(unaLista)-1
4 encontrado = False
9
6 while primero<=ultimo and not encontrado:
8 if unaLista[puntoMedio] == item:
9 encontrado = True
10 else:
12 ultimo = puntoMedio-1
13 else:
14 primero = puntoMedio+1
15
16 return encontrado
17
19 print(busquedaBinaria(listaPrueba, 3))
20 print(busquedaBinaria(listaPrueba, 13))
Cuando dividimos la lista suficientes veces, terminamos con una lista que tiene un
único ítem. Ya sea aquél ítem único el valor que estamos buscando o no lo sea. En
todo caso, habremos terminado.
10
funcionará estrictamente en tiempo logarítmico. Por suerte esto se puede remediar
pasando la lista junto con los índices de inicio y final.
A pesar de que una búsqueda binaria es generalmente mejor que una búsqueda
secuencial, es importante tener en cuenta que para valores pequeños de n, el costo
adicional del ordenamiento probablemente no vale la pena. De hecho, siempre
debemos considerar si es rentable asumir el trabajo extra del ordenamiento para
obtener beneficios en la búsqueda. Si podemos ordenar una sola vez y luego buscar
muchas veces, el costo del ordenamiento no es tan significativo. Sin embargo, para
listas grandes, incluso ordenar una vez puede resultar tan costoso que simplemente
realizar una búsqueda secuencial desde el principio podría ser la mejor opción.
11
CONCLUSIONES
12
forma que no tengamos que recurrir a usar bucles o ciclos haciendo el código más
eficiente y ahorrándonos pasos. En la investigación nos informa sobre sus
procedimientos los cuales deben llevarse a cabo para tener un procedimiento de
recursividad correcto, también habla sobre sus características las cuales son el de
poder subdividir un problema complejo en partes cada vez más sencillas, debe llegar a
un fin para cumplir con un propósito y debe tener valores base para que cada vez que
la función se refiera a sí mismo, el argumento de la función debe acercarse más al
valor base. De igual forma sabemos que existen tipos de recursividad los cuales son
directa e indirectas, en las directas es cuando una función, procedimiento o método se
invoca a sí misma, a el proceso se le denomina recursión directa y en la indirecta es
cuando invoca a una segunda función que esta a su vez invoca a la primera, a este
proceso se le denomina recursión indirecta. Se mostraron ejemplos de casos de
recursividad los cueles fueron la secuencia de Fibonacci, función factorial, torres de
Hanói y la búsqueda binaria. Me intereso mucho la secuencia de Fibonacci aunque
solamente es la suma de los anteriores pero si su fin es un número realmente extenso
el resultado lo será aún más, aunque la más espectacular seria las torres de Hanói
porque con el uso de la recursividad podemos conocer la solución del problemas sin
importan la cantidad de aros que tenga el problema en cuestión. Al final la unidad dos
es muy corta puesto que solo cuenta con tres temas pero son esenciales para el
entendimiento de la materia, y con la ayuda de la recursividad podemos generar
códigos más eficientes.
13
Gabriela Gómez Robledo
La recursividad es una técnica de programación que se utiliza para realizar una llamada
a una función desde ella misma. En esta investigación pudimos saber que tenemos dos
tipos de recursividad ya sea directa o indirecta, la directa se llama así misma, mientras
que la indirecta cuando una función puede invocar a una segunda función que a su vez
invoca a la primera, como también podemos descubrir que tiene dos componentes, el
caso base que es el resultado más simple, lo que conoce la función.
14
BIBLIOGRAFÍA
https://es.wikipedia.org/wiki/Recursión_(ciencias_de_computación)#Factorial
http://di002.edv.uniovi.es/~jotero/16122004/recursividad.pdf
15