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