Está en la página 1de 37

ESTRUCTURA DE DATOS

SESION 02:
Recursividad
Ordenación recursiva con QuickSort y MergeSort

Docente :
Ing. Daniel Angeles Pinillos
ESTRUCTURA DE DATOS

Video
Cómo resolver las TORRES DE HANÓI (+leyenda) |
MATEMORFISMOS 2
https://www.youtube.com/watch?v=CIAQb3xbmzg
ESTRUCTURA DE DATOS

CONTENIDO

Recursividad

• Ordenación recursiva con QuickSort y MergeSort.


• Guía de Ejercicios de Laboratorio02: Recursividad
PROGRAMACION
ESTRUCTURA DE DATOS
ORIENTADO A OBJETOS

RECURSIVIDAD
ESTRUCTURA DE DATOS

Recursividad

La recursividad es una
técnica potente de
programación que
puede utilizarse en lugar
de la iteración para
resolver determinados
tipos de problemas.
ESTRUCTURA DE DATOS

Recursividad

Por ejemplo, para escribir un método que calcule el factorial de un


número entero no negativo, podemos hacerlo a partir de la definición de
factorial:

Esto dará lugar a una solución iterativa en Java mediante un bucle


for:
ESTRUCTURA DE DATOS

Recursividad
ESTRUCTURA DE DATOS

Recursividad

Pero existe otra definición de factorial en función de sí misma:

Esta definición da lugar a una solución recursiva del factorial


en Java:
ESTRUCTURA DE DATOS

Recursividad

Un método es recursivo cuando entre sus instrucciones se


encuentra una llamada a sí mismo.

La solución iterativa es fácil de entender. Utiliza una variable para


acumular los productos y obtener la solución. En la solución recursiva
se realizan llamadas al propio método con valores de n cada vez más
pequeños para resolver el problema.
Cada vez que se produce una nueva llamada al método se crean en
memoria de nuevo las variables y comienza la ejecución del nuevo
método.
Para entender el funcionamiento de la recursividad, podemos pensar
que cada llamada supone hacerlo a un método diferente, copia del
original, que se ejecuta y devuelve el resultado a quien lo llamó.
En la figura siguiente podemos ver como sería la ejecución del
programa Java anterior para calcular el factorial de
ESTRUCTURA DE DATOS

Recursividad
ESTRUCTURA DE DATOS

Recursividad
ESTRUCTURA DE DATOS

Recursividad
ESTRUCTURA DE DATOS

Recursividad

• Un método recursivo debe contener:


•      Uno o más casos base: casos para los que existe una
solución directa.
•      Una o más llamadas recursivas: casos en los que se llama sí
mismo
• Caso base: Siempre ha de existir uno o más casos en los que
los valores de los parámetros de entrada permitan al método
devolver un resultado directo. Estos casos también se
conocen como solución trivial del problema.
• En el ejemplo del factorial el caso base es la condición:
ESTRUCTURA DE DATOS

Recursividad

si n=0 el resultado directo es 1    No se produce llamada recursiva.

• Llamada recursiva: Si los valores de los parámetros de entrada no


cumplen la condición del caso base se llama recursivamente al método. En
las llamadas recursivas el valor del parámetro en la llamada se ha de
modificar de forma que se aproxime cada vez más hasta alcanzar al valor
del caso base.
• En el ejemplo del factorial en cada llamada recursiva se utiliza n-1
ESTRUCTURA DE DATOS

Recursividad

return n * ( factorial(n-1) );
por lo que en cada llamada el valor de n se acerca más a 0 que es el
caso base.
La recursividad es especialmente apropiada cuando el problema a
resolver (por ejemplo calculo del factorial de un número) o la
estructura de datos a procesar (por ejemplo los árboles) tienen una
clara definición recursiva.
No se debe utilizar la recursión cuando la iteración ofrece una
solución obvia. Cuando el problema se pueda definir mejor de
una forma recursiva que iterativa lo resolveremos utilizando
recursividad.
ESTRUCTURA DE DATOS

Recursividad

• Para medir la eficacia de un algoritmo recursivo se tienen en


cuenta tres factores:
• Tiempo de ejecución
• Uso de memoria
• Legibilidad y facilidad de comprensión
Las soluciones recursivas suelen ser más lentas que las
iterativas por el tiempo empleado en la gestión de las
sucesivas llamadas a los métodos. Además consumen más
memoria ya que se deben guardar los contextos de
ejecución de cada método que se llama.
ESTRUCTURA DE DATOS

Recursividad

• A pesar de estos inconvenientes, en ciertos problemas, la


recursividad conduce a soluciones que son mucho más fáciles
de leer y comprender que su correspondiente solución
iterativa. En estos casos una mayor claridad del algoritmo
puede compensar el coste en tiempo y en ocupación de
memoria.
• De todas maneras, numerosos problemas son difíciles de
resolver con soluciones iterativas, y sólo la solución
recursiva conduce a la resolución del problema (por
ejemplo, Torres de Hanoi o recorrido de Árboles).
ESTRUCTURA DE DATOS

Recursividad

Ejemplos de Recursividad. Calcular 2 elevado a n


ESTRUCTURA DE DATOS

Recursividad

Ejemplos de Recursividad. Calcular 2 elevado a n


ESTRUCTURA DE DATOS

Recursividad

La solución iterativa a este problema sería esta:


ESTRUCTURA DE DATOS
Java Quicksort

La recursividad es una técnica potente de programación que puede


utilizarse en lugar de la iteración para resolver determinados tipos
de problemas.
El método de ordenación Quicksort fue desarrollado por
Hoare en el año 1960.
Es el algoritmo de ordenación más rápido.
Se basa en la técnica divide y vencerás, que consiste en ir
subdividiendo el array en arrays más pequeños, y ordenar
éstos. Para hacer esta división, se toma un valor del array
como pivote, y se mueven todos los elementos menores
que este pivote a su izquierda, y los mayores a su derecha.
A continuación se aplica el mismo método a cada una de las
dos partes en las que queda dividido el array.
ESTRUCTURA DE DATOS
Java Quicksort

• Después de elegir el pivote se realizan dos búsquedas:


• Una de izquierda a derecha, buscando un elemento
mayor que el pivote
• Otra de derecha a izquierda, buscando un elemento
menor que el pivote.
• Cuando se han encontrado los dos elementos
anteriores, se intercambian, y se sigue realizando la
búsqueda hasta que las dos búsquedas se
encuentran.
• La implementación del método de ordenación
Quicksort es claramente recursiva.
ESTRUCTURA DE DATOS
Java Quicksort

• Suponiendo que tomamos como pivote el primer


elemento, el método Java Quicksort que
implementa este algoritmo de ordenación para
ordenar un array de enteros se presenta a
continuación. Los parámetros izq y der son el
primer y último elemento del array a tratar en
cada momento.
• El método ordena un array A d eenteros desde la
posición izq hasta la posición der. En la primera
llamada recibirá los valores izq = 0, der =
ELEMENTOS-1.
ESTRUCTURA DE DATOS Java Quicksort

De forma gráfica el proceso sería el siguiente:


ESTRUCTURA DE DATOS

Java Quicksort

• La elección del pivote determinará la eficiencia de este algoritmo ya que


determina la partición del array. Si consideramos que el array está desordenado,
podemos elegir el primer elemento y el algoritmo funcionaría de forma eficiente.
Pero si el array está casi ordenado, elegir el primer elemento como pivote sería
una mala solución ya que obtendríamos un subarray muy pequeño y otro muy
grande. Por la misma razón, elegir el último elemento del array como pivote
también es una mala idea. Pretendemos conseguir que el tamaño de los
subarrays sea lo más parecido posible.

Una alternativa a elegir el primer elemento es elegir como pivote un elemento al
azar de entre todos los del array.
• Otra estrategia es calcular la mediana de los valores de la izquierda, centro y
derecha del vector.
• Por ejemplo para el vector: 9 8 1 6 10 2 3, se calcula la mediana de los elementos
que ocupan el primer lugar, el último y el centro o sea 9 3 6. La mediana es 6 que
determinaría las particiones {1 3 2} {6} {8 10 9}.
ESTRUCTURA DE DATOS

Java Quicksort

• En el peor caso, cuando el pivote es el elemento menor del array el


tiempo de ejecución del método Quicksort es O(n2).
• En general el tiempo medio de ejecución del Quicksort es O(n log n).
ESTRUCTURA DE DATOS

Método de ordenación MergeSort

• El método MergeSort es un algoritmo de ordenación recursivo con un


número de comparaciones entre elementos del array mínimo.
• Su funcionamiento es similar al Quicksort, y está basado en la técnica
divide y vencerás.
• De forma resumida el funcionamiento del método MergeSort es el
siguiente:
• - Si la longitud del array es menor o igual a 1 entonces ya está ordenado.
• - El array a ordenar se divide en dos mitades de tamaño similar.
• - Cada mitad se ordena de forma recursiva aplicando el método
MergeSort.
• - A continuación las dos mitades ya ordenadas se mezclan formando una
secuencia ordenada.
ESTRUCTURA DE DATOS

Método de ordenación MergeSort

• La ordenación mergesort se puede implementar en Java


de la siguiente forma:
ESTRUCTURA DE DATOS

Método de ordenación MergeSort

• La ordenación mergesort se puede implementar en Java


de la siguiente forma:
ESTRUCTURA DE DATOS

Método de ordenación MergeSort

De forma gráfica podemos


representar el
funcionamiento del
algoritmo de la siguiente
forma:

El tiempo de ejecución
promedio del método
MergeSort es O(n log n).
ESTRUCTURA DE DATOS

Método de ordenación MergeSort

• La ordenación mergesort se puede implementar en Java


de la siguiente forma:
ESTRUCTURA DE DATOS

Preguntas

?¿
ESTRUCTURA DE DATOS

Lectura
• Ingresa a Recursos /Material informativo, allí encontraras
una serie de links de lecturas de libros digitales con respecto
al tema de la recursividad.
• Lectura 1 : SZNAJDLEDER, P. (2017). Algoritmo a Fondo.
• https://books.google.com.pe/books?id=GkrVDQAAQBAJ&prin
tsec=frontcover&dq=Recursividad+en+Java+paper&hl=es-419
&sa=X&ved=0ahUKEwjG74eZzsPoAhXumOAKHQPoCM0Q6AEI
STAE#v=onepage&q=recursividad&f=false
•  
• Lectura 2: Deitel, H.,Deitel,P.(2003 ). Cómo programar en
Java. p.225
ESTRUCTURA DE DATOS

Guía de Laboratorio 02
• Desarrollar los ejercicios elaborados y
propuestos de la Guía de Laboratorio 01 y
deberá de subirlo en la Carpeta Laboratorio 01
que se encuentra en Recursos / Material
informativo.
•  
ESTRUCTURA DE DATOS

METACOGNICIÓN
El estudiante responde a las preguntas (Aula
Virtual Docente: Consultas): ¿Qué sabía? ¿Qué
aprendí? ¿Qué dudas todavía me quedan?
ESTRUCTURA DE DATOS

TRANSFERENCIA – EXTENSIÓN
Desarrollar el examen de evaluación en línea
basado de las ppts, videos y lecturas que se
encuentra en Examen en Línea.
GRACIAS

“Solo para los que quieren salir adelante”

También podría gustarte