Recursividad

¿Qué es? He de admitir que ando un poco vago con este concepto, lo poco que se, o que tengo claro es que es una función que se llama a si misma. Muy bien.
El otro día me pare a pensar, tras un ejemplo visto en clase, y me parecio entender que es una forma de programar evitable, así como el uso del break y del continue.

Y es que andaba yo programando en Python, algo que cada día aprecio mas, y me encontré en una disyuntiva por mi afán de generar un código eficiente, y mi una solución parecía ser la llamada a un continue dentro de un bucle while. Claro, nunca antes lo había utilizado así que tras informarme bien, me pareció entender que su uso se debe restringir a situaciones en el que no sea posible evitarlo, y al tenerlo tan claro, observe que yo si lo podía evitar. Tan solo eran necesarios unos cuantos retoques en el código.

Así que analizando casos de funciones recursivas, bastante básicos, he llegado a la conclusión de que si el único merito de estas es llamarse a sí mismas hasta que se cumpla una condición, estas, podrán ser sustituidas por alguna instrucción iterativa, por lo menos en niveles de baja complejidad. Por favor, que alguien me corrija si me equivoco!

Y aqui tenemos un ejemplo bastante basico:
Disponemos de un vector con unos nombres y queremos mostrarlos por pantalla

nombres=['Juan','Claudio','Inaki','Alberto']

La función llamada iterativa se compone por un bucle while del cual no saldra hasta que i
sea  igual a la longitud del vector llamado nombres, e irá imprimiendo los valores que se vayan encontrando en la posición i del vector:

def iterativa(nombres):
	i=0
	while not i==len(nombres):
		print nombres[i]
		i=i+1

La función llamada recursiva generará un vector igual al que recibe, para no modificarlo, y eliminara el primer elemento del nuevo vector justo después de mostrarlo,(esto se consigue con la función pop(), que por defecto muestra y elimina el ultimo, pero podemos indicarle la posición  del indice para adecuarlo a nuestras necesidades). Inmediatamente después comprobara si la longitud del nuevo vector es igual a 0 y si no es así se llamará a sí misma, pero esta vez con un vector que tendrá una posición menos, y así hasta que el numero de posiciones sea cero.

def recursiva(nombres):
	nombresCopia=nombres[:]
	print nombresCopia.pop(0)
	if (len(nombresCopia)>0):
		recursiva(nombresCopia)

Observamos que ya la segunda llamada se realiza con el nuevo vector, y que este se sobre-escribe luego a sí mismo.

Un apunte. Este paso que muestro debajo, realiza una copia del vector nombres y todos sus elementos en el vector nombresCopia

nombresCopia=nombre[:]

Si no lo hiciésemos así, Python, tan sólo nos crearía un enlace llamado nombresCopia a la misma posición de memoria que ocupa el vector llamado nombres. Por lo tanto, cualquier cambio sobre el vector nombresCopia se vería reflejado en el vector nombres, ya que el contenido de ambos proviene de la misma posición de memoria, que equivale a ser el mismo vector con dos enlaces de llamada diferentes.

Hemos visto la manera de sustituir una instrucción iterativa mediante una función recursiva, y viceversa. Sería interesante tratar de encontrar algún método de los dos que no permitiese el cambio al otro, o que resultase lo suficiente complejo como para evitarlo.

Se admiten discusiones!

Anuncios
Esta entrada fue publicada en Programación, Python. Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s