You are on page 1of 5

Recursividad o Recursin

Es una tcnica de programacin que se utiliza para realizar una


llamada a una funcin desde ella misma. El ejemplo ms utilizado
por su fcil comprensin es el clculo de nmeros factoriales. El
factorial de 0 es, por definicin, 1. Los factoriales de nmeros
mayores se calculan mediante la multiplicacin de 1 * 2 *,
incrementando el nmero de 1 en 1 hasta llegar al nmero para el
que se est calculando el factorial.
Uno de los ejemplos ms clsicos es la factorial de un nmero. Para
cualquier entero positivo N, el factorial de N (que se expresa como N!) es
el producto (multiplicacin) de todos los enteros menor a l, es decir:
1! = 1
2! = 1 x 2 = 2
3! = 1 x 2 x 3 = 6
4! = 1 x 2 x 3 x 4 = 24
5! = 1 x 2 x 3 x 4 x 5 = 120
6! = 1 x 2 x 3 x 4 x 5 x 6 = 720
De esta manera se puede ver que el factorial de cada nmero incluye el
factorial de todos los nmeros anteriores a l. Lo escrito en corchetes
rectos a continuacin es una referencia, no a nivel matemtico:
2! es 1[1!] x 2
3! es (1 x 2)[2!] x 3
Y as sucesivamente. Para cualquier entero N mayor a 1, podemos decir
que el factorial de N es igual al factorial del nmero anterior a N
multiplicado por N. La frmula N! = (N-1)! x N. Vuelve a la lista de
factoriales de 1 a 6. Entonces se podra decir que una buena prctica es
encontrar el factor en el resultado que se repite.
Es decir, es aquella propiedad que posee una funcin por la cual
esta puede llamarse a s misma. Se puede utilizar como una
alternativa a la iteracin. Una solucin recursiva es
normalmente menos eficiente en trminos de tiempo de
computadora que una solucin iterativa debido a las

operaciones auxiliares que lleva


suplementarias a las funciones.

consigo

las

llamadas

Punteros, son variables que contienen direcciones de memoria


como sus valores.
Lista enlazada, es un conjunto de elementos en los que cada
elemento contiene la posicin o direccin del siguiente elemento
de la lista. Cada elemento de la lista enlazada debe tener al
menos dos campo: un campo que tiene el valor del elemento y un
campo (enlace, link) que contiene la posicin del siguiente
elemento, es decir, su conexin, enlace o encadenamiento.
Lista doblemente enlazada, son listas que pueden recorrerse
en ambas direcciones. En estas listas cada nodo consta del campo
INFO de datos y dos campos de enlace: Anterior (Ant) y siguiente
(Sig) que apuntan hacia adelante y hacia atrs. Como cada
elemento tiene dos punteros, una lista doblemente enlazada
ocupa ms espacio en memoria que una lista simplemente
enlazada para una misma cantidad de informacin

Nodos, es uno de los elementos de una lista enlazada, de un


rbol o de un grafo. Cada nodo ser una estructura o registro que
dispondr de varios campos, y al menos uno de esos campos ser
un puntero o referencia a otro nodo, de forma que, conocido un
nodo, a partir de esa referencia, ser posible en teora tener
acceso a otros nodos de la estructura. Los nodos son herramientas
esenciales para la construccin de estructuras de datos dinmicas.
Lista mediante arreglos,
Las listas enlazadas debern implementarse de forma dinmica,
pero si el lenguaje no lo permite, lo realizaremos a travs de
arrays (o arreglos), con lo cual impondremos limitaciones en
cuanto al nmero de elementos que podr contener la lista y
estableceremos una ocupacin de memoria constante.
Los nodos podrn almacenarse en arrays paralelos o arrays de
registros.

Cuando se empleen arrays de registros, el valor (dato o


informacin) del nodo se almacenara en un campo y el enlace con
el siguiente elemento se almacenara en otro.
Coleccin ArrayList, ArrayList es una coleccin donde cada
objeto puede ser ubicado por su ndice. Como ya sabemos, en
Java, el ndice en una coleccin empieza de cero. ArrayList son
muy comunes porque, al contrario del tipo array, no tienen un
tamao definido.

ArrayList es la clase ideal si vamos a realizar muchas operaciones de acceso aleatorio sobre
la lista, ya que al estar implementado mediante un array dichas operaciones tienen un coste
constante e independiente del tamao de la lista. Sin embargo, esta clase no es la ms
adecuada si el tamao de la lista va a estar creciendo y decreciendo continuamente, ya que
implica reservar una memoria para el array interno; y las operaciones de borrado o insercin
en el medio de la lista tienen un coste lineal con el tamao de sta, ya que potencialmente
implican desplazar hacia adelante (en la insercin) o hacia atrs (en el borrado) todos los
elementos de la lista. LinkedList por la contra tiene un rendimiento malo (lineal en el nmero
de elementos) para las operaciones de acceso aleatorio, ya que pueden implicar recorrer
todos los elementos de la lista. Sin embargo, las operaciones de borrado o insercin en el
medio, o el crecer o decrecer dinmicamente su tamao tienen un coste constante e
independiente del nmero de elementos que contenga la lista (ver figura 2). Dependiendo de
la aplicacin concreta para la cual necesitemos la lista ser mejor optar por una u otra
implementacin.

FIGURA 2: Operaciones de insertado y borrado en un LinkedList


En el listado 2 podemos ver un cdigo en el cual se emplea una LinkedList para almacenar un
conjunto de Strings (nombres de personas). Empleando el mtodo que devuelve el iterador
definido en la interfaz Collection recorremos la lista hacia adelante mostrando su contenido
por consola. Despus eliminamos un elemento y la recorremos hacia atrs empleando el
iterador definido en la interfaz List. Observa como, a pesar de que se ha empleado un
LinkedList, la variable en la cual almacenamos la lista es de tipo List; es decir, nuestro cdigo
no tiene ninguna dependencia con la clase concreta que esta implementando la lista ms all
de la lnea donde sta fue creada. Por tanto, con slo cambiar la lnea de cdigo:

List lista = new LinkedList();

por la lnea:
List lista = new ArrayList();

LinkedList y sus mtodos bsicos.

La clase LinkedList implementa la interface List. Eso quiere decir que tendr
una serie de mtodos propios de esta interface y comunes a todas las
implementaciones. As utilizando siempre que se pueda declaracin de
objetos del tipo definido por la interface podemos cambiar de forma
relativamente fcil su implementacin (por ejemplo pasar de ArrayList a
LinkedList y viceversa) y conseguir mejoras en el rendimiento de nuestros
programas con poco esfuerzo.
/* Ejemplo Interface List aprenderaprogramar.com */
public class Persona{
private int idPersona;
private String nombre;
private int altura;

public Persona(int idPersona, String nombre, int altura) {


this.idPersona = idPersona;
this.nombre = nombre;
this.altura = altura;}

@Override
public String toString() {
return "Persona-> ID: "+idPersona+" Nombre: "+nombre+" Altura: "+altura+"\n";
}
}

You might also like