Indice    Avanti    Indietro




9. Ricorsione
       Istruzioni esaminate: make


Ci occuperemo ora di una nuova versione della procedura conta esaminata nel numero precedente che ci consentirà di capire una tecnica importante della programmazione Logo. Ecco la nuova procedura (che produce esattamente lo stesso output di quella già esaminata, visualizza cioè i numeri da 1 a 10)

to conta
   make "i 1
   esegui
end

to esegui
   print :i
   if :i=10 [stop]
   make "i :i+1
   esegui
end

Nella procedura conta trovate la nuova istruzione make che serve ad assegnare un valore ad una variabile; nel nostro caso viene assegnato il valore 1 alla variabile i (alla variabile che ha per nome i). Il nome della variabile deve essere preceduto dalle virgolette; attenzione, non confondete il nome di una variabile col valore di una variabile che deve essere preceduto dai due punti. Dopo l'assegnazione, la procedura conta non fa altro che chiamare la procedura esegui; quest'ultima rappresenta la parte più interessante del nostro programma (usiamo per la prima volta il termine programma che ha il significato di insieme di procedure).

Esaminiamo allora la procedura esegui. La prima cosa che balza agli occhi sta nel fatto che la procedura esegui chiama se stessa. Quando ciò accade siamo di fronte ad una procedura ricorsiva. Ma esaminiamo le cose con calma.

Quando si entra per la prima volta nella procedura esegui il valore della variabile i è 1 (perchè questo è il valore che gli abbiamo assegnato). La prima istruzione, print :i, visualizzerà dunque il valore 1. L'istruzione if successiva ha lo scopo di verificare se il valore di i è 10 (se lo fosse verrebbe interrotta l'esecuzione della procedura esegui ma poiché i vale 1 si prosegue). A questo punto l'istruzione make assegna alla variabile i il valore attuale di i più 1; quindi dopo quest'assegnazione i vale 2. Ed eccoci alla chiamata ricorsiva: la procedura esegui viene chiamata (cioè eseguita) per la seconda volta. Questa volta però si entra nella procedura con i che vale 2. Quindi il valore visualizzato dall'istruzione print :i sarà, ora, 2. L'istruzione if, di nuovo, non produrrà alcune effetto (perchè i=2). La nuova assegnazione porterà il valore di i a 3. Si rientrerà quindi, per la terza volta, nella procedura esegui. Ma ora il meccanismo dovrebbe esservi chiaro. La procedura esegui si interromperà quando sarà i=10 (a causa della if) e saranno dunque visualizzati i numeri da 1 a 10.

Sul piano didattico potrà esservi d'aiuto rappresentare concretamente una variabile con una scatolina di cartone sulla quale avrete scritto il suo nome, ad esempio i, e all'interno della quale potrete inserire un valore, ad esempio un dischetto numerato (come quelli che si usano per giocare a tombola). Potrete quindi simulare i vari passi della nostra procedura: il valore di una variabile sarà il valore del dischetto in essa contenuto, assegnare un valore significherà inserire un dischetto nella scatolina sostituendolo a quello che fosse già presente. Con questa modellizzazione diventa semplice far capire ai ragazzi il significato, ad esempio, dell'istruzione make "i :i+1: si guarda qual è il valore contenuto nella scatola i e lo si sostituisce con lo stesso valore aumentato di 1.

Esaminiamo ora un'elegante procedura ricorsiva di tipo geometrico in cui entra in gioco il successivo incremento di una variabile; questa volta però non utilizzeremo l'istruzione make ma un "meccanismo" più comodo che produce lo stesso effetto:

to spirale :LATO :ANGOLO
   fd :LATO
   rt :ANGOLO
   if :LATO > 200 [stop]
   spirale :LATO+2 :ANGOLO
end

Nella schermata seguente vediamo la spirale generata chiamando

spirale 5 90

Cerchiamo di capirne il funzionamento. Le rotazioni eseguite sono tutte di 90 gradi, gli avanzamenti vanno invece via via aumentando. Si entra per la prima volta nella procedura con un valore di LATO uguale a 5, quindi il primo avanzamento è di 5 passi. Nella chiamata ricorsiva, alla variabile LATO si assegna il valore attuale di LATO più 2

spirale :LATO+2 :ANGOLO

Quindi il secondo avanzamento sarà di 7 passi. E poi si capisce che il terzo avanzamento sarà di 7+2=9 passi e così via. Il processo termina quando il valore di LATO supera 200. Nella schermata seguente vedete l'effetto di

spirale 5 60