Procedimientos Recursivos que Reportan
El procedimiento escriberevés es un mando, no un reportero.
para escriberevés :palabra
si :palabra = " [es " alto]
inserta último :palabra
escriberevés menosúltimo :palabra
fin
Puede resultar de utilidad definir un nuevo procedimiento, invierte, que es similar a escriberevés, excepto por el hecho de que, en lugar de escribir el resultado, lo reporta. Como primera cosa, cambiaremos simplemente inserta (y escribe) por reporta:
para invierte :palabra
si :palabra = " [reporta "]
reporta último :palabra
invierte menosúltimo :palabra
fin
Vamos a probarlo.
muestra invierte "sol
l
El problema consiste en que reporta hace que su procedimiento se detenga y reporte el resultado del mando o del reportero que está utilizando como entrada. Cuando Logo ve la línea reporta último :palabra, inmediatamente se detiene y reporta l a muestra.
Los elementos del procedimiento que necesitamos están en la definición de invierte: simplemente necesitan que se los cambie de lugar. Debemos pensar en el resultado como el reporte de último de :palabra ( en este caso, l) más el resultado final de invertir menosprimero de :palabra (os). Esto lleva a una combinación de las dos líneas finales de invierte para que el resultado sea una palabra en sí misma:
para invierte :palabra
si :palabra = " [reporta "]
reporta palabra último :palabra invierte menosúltimo :palabra
fin
Dado que este tipo de procedimiento constituye un modelo de un procedimiento recursivo que reporta, resulta útil analizar las entradas y los reportes que el procedimiento produce mientras se ejecuta. Vamos a usar el modelo de trazado que utilizamos anteriormente:
invierte "sol
invierte "sol
La entrada es sol.
si "sol = " [reporta "]
reporta palabra último "sol
invierte menosúltimo "sol
invierte "so
La entrada es so.
si "so = " [reporta "]
reporta palabra último "so
invierte menosúltimo "soinvierte "s
La entrada es s.
si "s = " [reporta "]
reporta palabra último "s
invierte menosúltimo "sinvierte "
si " = " [reporta "]
invierte " reporta "
invierte "s reporta s
invierte "so reporta os
invierte "sol reporta losCada reporte de invierte es el resultado del procedimiento que lo llama, en este caso otro invierte. La regla de detención es muy importante para hacer que el proceso se detenga, de esta forma invierte puede dar un reporte directamente sin tener el problema de invertir una palabra todavía más corta.
Una vez que invierte " reporta una palabra vacía, invierte "s combina s (último de su entrada) con una palabra vacía, y así puede reportar este resultado a invierte "so. invierte "so combina o (último de "so) con su entrada s y así reporta os a invierte "sol. invierte "sol combina l con su entrada os y finalmente reporta los.