Cómo detener los Procedimientos Recursivos
Añadir dentro de un procedimiento recursivo una regla de detención constituye una parte importante de su definición. Cuando un procedimiento recursivo tiene una regla de detención, se abre la posibilidad de avanzar hacia formas más complejas de recursión.
Una regla de detención obvia para el procedimiento poliespi sería decidir que debe detenerse cuando :paso sea demasiado grande, digamos mayor que 200. La regla utilizará el mando alto para detener el procedimiento en ejecución. La regla de detención tendrá la siguiente forma:
si :paso > 200 [alto]
En Logo el enunciado si se llama expresión condicional. Logo controlará si el valor de :paso es mayor que 200 cada vez que poliespi se llame a sí mismo. Cuando la condición se transforma en cierta, entonces poliespi se detiene.
Hay una cantidad de primitivas que resultan muy útiles para construir condiciones. Mayor que (>) es un predicado. Un predicado reporta cierto o falso. En aritmética, = (Igual), > (Mayor que) y < (Menor que) son predicados. El procedimiento modificado poliespi se verá de la siguiente manera:
para poliespi :paso :ángulo :inc
si :paso > 200 [alto]
adelante :paso
derecha :ángulo
poliespi :paso + :inc :ángulo :inc
finEncontrar una regla de detención para poli resulta más tramposo. Como se ha comentado en El estado de la Tortuga, poli completa una figura cuando la tortuga vuelve a su estado inicial. Para los polígonos simples, esto significa que la tortuga debe realizar una rotación completa de 360 grados. Para realizar polígonos más complicados, como las estrellas, la tortuga debe girar un número entero múltiplo de 360 grados. Una forma de hacerlo, como mostramos en el ejemplo de más abajo, sería mediante una regla de detención, que haga que el dibujo se detenga en el momento en que la tortuga vuelva a tener su rumbo inicial.
En este caso, lo único que se necesita saber es el rumbo de la tortuga en el momento en que comienza el proceso y compararlo con el rumbo que tiene la tortuga luego de cada giro.Se puede añadir otra entrada a poli para controlar el rumbo antes del inicio. Así, cuando el rumbo en curso sea igual al inicial, el procedimiento se detendrá. La regla de detención tendrá la siguiente forma:
si rumbo = :inicio [alto]Esta regla de detención debe estar ubicada antes del primer mando derecha, ya que de otra forma poli se detendría inmediatamente, incluso antes de comenzar a dibujar.
para poli :paso :ángulo :comienzo
adelante :paso
derecha :ángulo
si rumbo = :comienzo [alto]
poli :paso :ángulo :comienzo
finAl usar poli ahora, vemos que la primitiva rumbo se convierte en el valor de la tercera entrada.
Rumbo es un reportero, realiza una operación que devuelve información; en este caso, el rumbo en curso de la tortuga. poli 50 120 rumbo
Escribir siempre la palabra adicional, rumbo, puede ser dificultoso. Una solución podría ser escribir un superprocedimiento que ejecute poli, que permita sólo entradas para paso y ángulo.
para superpoli :paso :angulo
poli :paso :ángulo rumbo
fin