Sei sulla pagina 1di 3

Recursividad

Es una técnica utilizada en programación que nos permite que un bloque de instrucciones se
ejecute un cierto número de veces (el que nosotros determinemos). A veces es algo complicado de
entender, pero no os preocupéis. Cuando veamos los ejemplos estará clarísimo. En Java, como en
otros muchos lenguajes, los métodos pueden llamarse a sí mismos. Gracias a esto, podemos
utilizar a nuestro favor la recursividad en lugar de la iteración para resolver determinados tipos de
problemas.

Ejemplo sencillo

Vamos a ver un pequeño ejemplo que no hace absolutamente nada. Es un método cuyo
único objetivo es llamarse a sí mismo:

1 void cuentaRegresiva () {
2 cuentaRegresiva();
3}

Si ejecutáis esto, os va a dar un error en la pila (mítico StackOverflow Error, Biblia de los
programadores).

Como véis, he llamado al método cuentaRegresiva porque vamos a mostrar por pantalla la
cuenta atrás de un número que nosotros pasemos como parámetro a la función. Por
ejemplo, para hacer la cuenta atrás de 10 sin recursividad, haríamos:

1 for( int i = 10; i >= 0; i--) {


2 System.out.println(i);
3}

Ahora, para hacerlo de manera recursiva, tendríamos que pasar como parámetro un
número. Además, tras imprimir ese número, llamaremos a la misma función con el número
actual restando uno:

1 void cuentaRegresiva(int numero) {


2 System.out.println(numero);
3 cuentaRegresiva(numero - 1);
4}

Es lo que os he comentado arriba. Llamamos a la función con un 10. Imprimimos el 10 y


llamamos a la función con un 9. Imprimimos el 9 y llamamos a la función con un 8. Así
hasta el fin de los días. Digo hasta el fin de los días porque os va a saltar error si ejecutáis
esto así directamente:
1 public class Recursividad {
2
3 static void cuentaRegresiva(int numero) {
4 System.out.println(numero);
5 cuentaRegresiva(numero - 1);
6 }
7
8 public static void main(String[] args) {
9 cuentaRegresiva(10);
10 }
11
12 }

Problema: llamada infinita. Para ello, lo que tenemos que hacer es que cuando el número
sea 0, deje de llamar a la función. Para eso, metemos una estructura condicional de toda la
vida. Gracias al condicional, dejará de ejecutarse a partir de 0:

1 void cuentaRegresiva(int numero) {


2 System.out.println(numero);
3 if(numero > 0) {
4 cuentaRegresiva(numero - 1);
5 }
6}

Las colecciones pueden ser, según se almacenen los objetos, de 2 tipos:

 Ordenadas: Pueden ser recorridas siguiendo un orden, ya sea por un


índice como por el orden en el que se han insertado.

 Clasificadas: Los objetos están clasificados siguiendo un orden


natural.definido por la clase del objeto.
Hay 4 tipos de interfaces de colección:
List: Lista de objetos asociados a un índice. Acepta duplicados. Tiene asociada 3 clases a las que
implementa:

 ArrayList: Representa una lista ordenada pero no clasificada. La iteración


o recorrido por esta colección es muy rápida.

 Vector: Igual que ArrayList, pero sus métodos son Synchronized (Ya lo
explicaremos más adelante)

 LinkedList: Representa una lista ordenada y clasificada. La iteración o


recorrido por esta colección es mas lenta que por ArrayList o Vector.

o Set: Representa un conjunto de elementos. No admite duplicados. Tiene asociada


3 clases a las que implementa:

 HashSet: Es un conjunto no ordenado y no clasificado de elementos.

 LinkedHashSet: Es un conjunto ordenado y no clasificado de elementos.

 TreeSet: Es un conjunto ordenado y clasificado.

o Map: Conjunto de elementos con una clave o identificador. Tiene asociada 4


clases a las que implementa:

 HashMap: No es ni ordenada ni clasificada, permite tener claves con valor


"null" y varios elementos con valor "null".

 Hashtable: Igual que HashMap, pero con métodos Synchronized.

 LinkedHashMap: Ordenada por orden de inserción.

 TreeMap: Es ordenada y clasificada.

o Queue: Se trata una interfaz de tipo (LIFO) y pila (FIFO). Algo que se debería
saber:

 LIFO: Last In, First Out. Último en entrar, primero en salir.

 FIFO: First In, First Out: Primero en entrar, primero en salir

o Tiene una clase asociada a la que implementa (que yo haya estudiado)

 PriorityQueue: Los elementos son ordenados según su orden natural.