Ricordiamo che un albero è costituito da:
to ramo :ricorsione :lun
if :ricorsione = 0 [stop]
fd :lun
rt 20 ramo :ricorsione - 1 :lun
lt 40 ramo :ricorsione - 1 :lun
rt 20 ;riporta la tarta allo stato iniziale
bk :lun ;riporta la tarta allo stato iniziale
end
Le ultime due istruzioni sono di solito una "sorpresa" al primo approccio e sono legate alla questione della "trasparenza dello stato". Nell'ambiente osservatore scriveremo invece
to inizia
ca
crt 1
ask-turtles[pd]
end
Ecco la figura che otteniamo dopo gli ordini inizia e ramo 10 15 mentre la velocità di esecuzione è posta a 10, e l'esecuzione fermata forzatamente. Si vede che, per costruzione ricorsiva, l'albero si forma da destra verso sinistra.
Per trascrivere questa situazione nell'ambiente parallelo decidiamo che una tartaruga madre generi due figlie e assegni loro lo stesso suo compito imponendo alla nascita ad una di volgersi a destra e all'altra a sinistra. Dovrà poi rassegnarsi a morire. La prima procedura che scriviamo è dunque
to cammina :lun
fd :lun
hatch[rt 20 ]
hatch[lt 20 ]
die
end
Dopo il solito inizia, sulla finestra tartarughe scriviamo cammina 15 e assegnamo l'ordine varie volte. Il tutto sembra funzionare!! Ma se proviamo a scrivere un repeat 4[cammina 15] forse ci sorprendiamo. Le tartaghe figlie non eseguono, ovviamente, l'ordine. Per ovviare al problema una prima tecnica è quella di scrivere la procedura ricorsiva
to tree :iterazioni :lun
if 0 = :iterazioni [stop]
ask-turtles [cammina :lun ]
tree :iterazioni - 1 :lun
end
nella finestra osservatore. Il tutto funziona perfettamente come si può vedere dalla figura annessa ottenuta con la successione degli ordini
inizia, tree 10 15 ma seguendo lo spirito dello StarLogo, cerchiamo un approccio
ancora pił "decentralizzato". Allo scopo assegnamo ad ogni tartaruga una "generazione". La corrispondenza con la profondità della ricorsione sarà il livello generazionale. Usiamo due variabili globali finisci e lun che assegnamo tramite slider e scriviamo la seguente procedura
turtles-own[generazione]
to newtree
if generazione > finisci [stop]
set generazione generazione + 1
fd lun
hatch[rt 20 ]
hatch[lt 20 ]
die
end
Si aggiunge per la tartaruga un pulsante forever che esegue l'istruzione newtree e ..il nostro albero viene costruito. Si osservi la "naturalezza" dello stile di programmazione. E si osservi nella figura ottenuta con la procedura fermata in esecuzione come l'albero, a differenza di prima, si formi in modo bilanciato. Questa volta abbiamo giocato un po' con i colori prima di avviare la procedura.
to newtree :lun
if generazione > finisci [stop]
fd :lun
hatch[rt 20 ]
hatch[lt 20 ]
set generazione generazione + 1
die
end