Está en la página 1de 11

UNIVERSIDAD AUTONOMA DE NUEVO LEON

FACULTAD DE INGENIERIA MECANICA ELECTRICA

ACTIVIDAD REPORTE 3
"ALGORITMOS RECURSIVOS"

NOMBRE: KEVIN ALEJANDRO RODRIGUEZ REYNA


MATRICULA: 1995355
GRUPO: 003
SEMESTRE: ENERO-JUNIO2022 (2°SEMESTRE)
DOCENTE: JESSICA NATALIA MARTINEZ BALDERAS

SABADO 26 DE FEBRERO 2022, MONTERREY, NUEVO LEON


INTRODUCCION
El área de la programación es muy amplia y con muchos detalles. Los programadores
necesitan ser capaces de resolver todos los problemas que se les presente a través del
computador aun cuando en el lenguaje que utilizan no haya una manera directa de
resolver los problemas. En el lenguaje de programación C, así como en otros lenguajes
de programación, se puede aplicar una técnica que se le dio el nombre de recursividad
por su funcionalidad. Los algoritmos recursivos es una técnica que es utilizada en la
programación estructurada para resolver problemas que tengan que ver con la factorial
de un número, o juegos de lógica. Las asignaciones de memoria pueden ser dinámicas
o estáticas y hay diferencias entre estas dos y se pueden aplicar las dos en un programa
cualquiera.
DEFINICION
Es una técnica de programación importante. Se utiliza para realizar una llamada a una
función desde la misma función. Como ejemplo útil se puede presentar el cálculo de
números factoriales. Él factorial de 0 es, por definición, 1. Las factoriales de números
mayores se calculan mediante la multiplicación de 1 * 2 * …, incrementando el número
de 1 en 1 hasta llegar al número para el que se está calculando la factorial.

"Si el número es menor que cero, se rechaza. Si no es un entero, se redondea al siguiente


entero. Si el número es cero, su factorial es uno. Si el número es mayor que cero, se
multiplica por él factorial del número menor inmediato."

Para calcular la factorial de cualquier número mayor que cero hay que calcular como
mínimo la factorial de otro número. La función que se utiliza es la función en la que se
encuentra en estos momentos, esta función debe llamarse a sí misma para el número
menor inmediato, para poder ejecutarse en el número actual. Esto es un ejemplo de
recursividad. Están muy relacionadas, cualquier acción que pueda realizarse con la
recursividad puede realizarse con iteración y viceversa. Normalmente, un cálculo
determinado se prestará a una técnica u otra, sólo necesita elegir el enfoque más natural
o con el que se sienta más cómodo. Claramente, esta técnica puede constituir un modo
de meterse en problemas. Es fácil crear una función recursiva que no llegue a devolver
nunca un resultado definitivo y no pueda llegar a un punto de finalización. Este tipo de
recursividad hace que el sistema ejecute lo que se conoce como bucle "infinito".

Un requisito importante para que sea correcto un algoritmo recursivo es que no genere
una secuencia infinita de llamadas así mismo. Claro que cualquier algoritmo que genere
tal secuencia no termina nunca. Una función recursiva f debe definirse en términos que
no impliquen a f al menos en un argumento o grupo de argumentos. Debe existir una
"salida" de la secuencia de llamadas recursivas.

Si en esta salida no puede calcularse ninguna función recursiva. Cualquier caso de


definición recursiva o invocación de un algoritmo recursivo tiene que reducirse a la larga
a alguna manipulación de uno o casos más simples no recursivos.
PILAS
La pila es una estructura de datos que permite almacenar datos en el orden LIFO (Last
In First Out) en español, último en entrar, primero en salir).

La recuperación de los datos es hecha en el orden inverso de su inserción.

Para la implementación he elegido una lista enlazada simple, presentada sobre la


vertical.

Ya que la inserción es siempre hecha al inicio de la lista, el 1er elemento de la lista será
el ultimo elemento ingresado, por lo tanto estará en la cabeza de la pila.

No he utilizado un puntero fin, como lo hice en el caso de la lista enlazada simple, ya que
el objetivo no es el de tratar una lista enlazada, sino una pila.

Lo interesante es que el ultimo elemento ingresado, será el 1er elemento recuperado.

La construcción del modelo de un elemento de la pila

Para definir un elemento de la pila será utilizado el tipo struct.

El elemento de la pila contendrá un campo dato y un puntero siguiente.

El puntero siguiente debe ser del mismo tipo que el elemento, de lo contrario no podrá
apuntar hacia el elemento.
El puntero siguiente permitirá el acceso al próximo elemento.

typedef struct ElementoLista {

char *dato;

struct ElementoLista *siguiente;

}Elemento;

Para permitir las operaciones sobre la pila, vamos a guardar ciertos elementos:

• el primer elemento

• el numero de elementos

El 1er elemento, que se encuentra en la cabeza de la pila, nos permitirá realizar la


operación de recuperación de los datos situados en la parte superior de la pila.

Para ello, será utilizada otra estructura (no es obligatorio, pueden ser utilizadas
variables).

typedef struct ListaUbicación{

Elemento *inicio;

int tamaño;

} Pila;

El puntero inicio contendrá la dirección del 1er elemento de la lista.

La variable tamaño contiene el número de elementos.

Nota:

Esta vez no utilizamos un puntero fin (ver la lista enlazada simple), no lo necesitamos
puesto que únicamente trabajamos al inicio de la lista. Cualquiera que sea la posición en
la lista, el puntero inicio apunta siempre hacia el 1er elemento, que estará en la cabeza
de la pila.
COLAS
La “cola” en un algoritmo recursivo traducción libre de tail recursion) es un mecanismo
que permite tener funciones recursivas sin temer por posibles desbordamientos de pila.
A diferencia de la recursividad normal, donde cada llamada recursiva implica la creación
de un nuevo frame en la pila de llamadas (y por lo tanto el peligro de desbordar el tamaño
de la pila), en la tail recursion es posible realizar dichas llamadas recursivas
reaprovechando el frame de pila anterior y evitando así el desbordamiento.

En una ejecución normal, sin aplicar TCO, al principio en el frame global de pila
tendríamos los valores de id y f (pues estas son las dos variables globales). Sabemos
que cuando se llama a una función se crea un frame de pila que contiene los valores de
las variables locales y la dirección de retorno. En la pila de llamadas puede no parecer
mucho, pero es muy interesante si somos capaces de crear funciones recursivas, donde
la llamada recursiva sea lo último que hagamos. En este caso, se puede aplicar TCO y
en lugar de tener un frame de pila por cada llamada recursiva, tendremos uno solo en
total. Es el mundo ideal: recursividad sin temer por el desbordamiento. A este tipo de
recursividad la conocemos como tail recursion (o recursividad de “cola”).
LISTAS
Es una colección de elementos dispuestos uno detrás del otro, en la que cada
elemento se conecta al siguiente por un "Enlace" o "Puntero".

Como se observa en la imagen, los nodos de las listas al igual que las colas y pilas,
está compuesta por una parte de información (que pude ser datos enteros, flotantes,
caracteres, estructuras..) y el puntero que mantiene el enlace entre un nodo y otro.

Existen varios tipos de Listas, pero para efectos de comprensión y sintetización,


hablaremos de cuatro tipos esenciales de listas:

Tipos De Listas

Lista simplemente enlazada: Cada nodo, contiene un único apuntador hacia el siguiente
nodo, por lo cual hace de él una estructura muy eficiente, ya que el último de la lista
apunta hacia null, por ello, es fácil hacer recorridos directos.
Listas Doblemente enlazadas: Esta lista se caracteriza por que sus nodos contienen dos
punteros, uno hacia el nodo siguiente y otro hacia el nodo anterior.

Listas Circulares: Este tipo de lista, es sólo una extensión de la lista simplemente
enlazada, con la diferencia que el último elemento se enlaza al primer elemento de la
lista, lo cual permite el recorrido en forma de anillo

Lista Circular Doblemente enlazada: Quizá este tipo de lista, sea la más compleja, ya
que es la combinación de la lista circular y las doblemente enlazadas, ya que es una lista
doblemente enlazada donde el primer elemento se conecta con el último y viceversa.
EJEMPLOS
CONCLUSION
En conclusión, podemos decir que los algoritmos recursivos son aquellos que realizan
llamadas recursivas para llegar al resultado, y algoritmos iterativos a aquellos que llegan
a un resultado a través de una iteración mediante un ciclo definido o indefinido. Todo
algoritmo recursivo puede expresarse como iterativo y viceversa. Sin embargo, según
las condiciones del problema a resolver podrá ser preferible utilizar la solución recursiva
o la iterativa. A medida que se realizan llamadas a funciones, el estado de las funciones
anteriores se almacena en una pila de llamadas a funciones. Esto permite que sea
posible que una función se llame a sí misma, pero que las variables dentro de la función
tomen distintos valores. La recursión es el proceso en el cual una función se llama a sí
misma. Este proceso permite crear un nuevo tipo de ciclos. Siempre que se escribe una
función recursiva es importante considerar el caso base (el que detendrá la recursividad)
y el caso recursivo (el que realizará la llamada recursiva). Una función recursiva sin caso
base, es equivalente a un bucle infinito. Una función no es mejor ni peor por ser recursiva.
En cada situación a resolver puede ser conveniente utilizar una solución recursiva o una
iterativa. Para elegir una o la otra será necesario analizar las características de elegancia
y eficiencia. Asimismo, con esto he reforzado mi conocimiento sobre los algoritmos
recursivos sobre su definición y sus diferentes ejemplos que existen.
BIBLIOGRAFIA

E. (2016, 3 febrero). Recursividad de “cola” (tail recursion). campusMVP.es. Recuperado 24 de

febrero de 2022, de https://www.campusmvp.es/recursos/post/Recursividad-de-cola-tail-

recursion.aspx

[Pilas y colas] Solo use un algoritmo de función recursiva para operar una pila, de modo que las

pilas estén ordenadas en orden inverso. - programador clic. (2000, 2 abril). Pilas y colas.

Recuperado 24 de febrero de 2022, de https://programmerclick.com/article/7850229184/

También podría gustarte