Download Recursión - Anaya Multimedia

Document related concepts
no text concepts found
Transcript
El lenguaje Python
129
totalmente desarrolladas, como podemos ver en http://www.python. org/peps/
pep-0342.html. El cambio más importante en la versión 2.5 es que yield no es
una sentencia sino una expresión, por lo que tiene un valor. Cuando reanudamos
un generador invocando a su método next, el valor equivalente de yield es None.
Para transmitir un valor x a algún generador g (para que g reciba a x como el
valor de yield en el que está suspendido), en lugar de llamar a g.next(), el
invocador llama a g.send(x) (invocar a g.send(None) es igual que llamar a
g.next()). Además, en Python 2.5, una expresión yield (vacía) sin argumentos,
se convierte en válida y equivalente a yield None. Otra mejora de la versión 2.5
de Python tiene que ver con las expresiones, que veremos en próximos apartados.
Recursión
Python admite recursión (es decir, una función Python puede llamarse a sí
misma), pero hay límites en la profundidad de una recursión. Por defecto, Python
interrumpe la recursión y provoca una excepción RecursionLimitExceeded
(cuando detecta que la pila (de memoria) de llamadas recursivas ha sobrepasado
una profundidad de 1.000). Podemos cambiar el límite de recursión con la función setrecursionlimit del módulo sys.
No obstante, el cambio del límite de recursión no nos proporciona recursiones
ilimitadas; el límite máximo total depende de la plataforma en la que ejecutamos
nuestro programa, especialmente en el sistema operativo subyacente y en la biblioteca de runtime C, pero normalmente es de unos 1000 niveles.
Si las llamadas recursivas profundizan demasiado, nuestro programa fallará.
Dichas recursiones incontroladas, después de una llamada a setrecursionlimit
que excede la capacidad de nuestra plataforma, es una de las pocas maneras que
provocan que un programa Python falle, sin la habitual red de protección del
mecanismo de excepción de Python. Por lo tanto, seremos prudentes a la hora de
intentar solucionar un programa que recibe excepciones R e c u r s i o n
LimitExceeded por situar el límite de recursión demasiado alto mediante
setrecursionlimit. La mayoría de las veces, el mejor consejo es buscar un
modo de eliminar la recursión, concretamente, limitando la profundidad de
recursión que nuestro programa necesita.
Los lectores familiarizados con lenguajes de programación funcionales como
Lisp, o Scheme, deben ser conscientes de que Python no implementa la
optimización de la eliminación de "tail-call" (llamada final), que es muy importante en estos lenguajes. En Python, cualquier llamada, recursiva o no, tiene el
mismo coste en cuanto a espacio, tanto en tiempo como en memoria, dependiente sólo en el número de argumentos: el coste no cambia si la llamada es "Tail-call"
(es decir, que la llamada es la última operación que el invocador ejecuta) o cualquier otra llamada no-tail (no final).
04.PM6
129
09/10/2007, 18:59
04.PM6
130
09/10/2007, 18:59