1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

18
1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione

Transcript of 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

Page 1: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

1

PROGRAMMAZIONE IN LOGO3a e 4a Lezione

Programmare in scala e la ricorsione

Page 2: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

2

DISEGNARE IN SCALE DIFFERENTI

Abbiamo imparato a disegnare dei poligoni di dimensioni diverse in funzione della richiesta dell’utente.

Ora vi mostro un’altra possibilità dove l’oggetto si ridimensiona secondo una scala.

Digitate il seguente codice:to poligono :scala :nolati

repeat :nolati [fd 100*:scala rt 360/:nolati]

htend

Cosa succede?

Page 3: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

3

ESERCIZIO

Prova a generare i seguenti disegni a diverse scale, se riesci scrivi un’unica procedura!

Page 4: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

4

LA RICORSIONE

Una procedura è ricorsiva se invoca se stessa!

Primo esempio:to ballo

rt 1 ballo

end Cosa succede?????

Quali possono essere le potenzialità della ricorsione?

Page 5: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

5

LA RICORSIONE (TRATTO DA WIKIPEDIA)

Viene detto algoritmo ricorsivo un algoritmo espresso in termini di se stesso, ovvero in cui l'esecuzione dell'algoritmo su un insieme di dati comporta la semplificazione o suddivisione dell'insieme di dati e l'applicazione dello stesso algoritmo agli insiemi di dati semplificati.

Questo tipo di algoritmo risulta particolarmente utile per eseguire dei compiti ripetitivi su di un set di input variabili. L'algoritmo richiama se stesso generando una sequenza di chiamate che ha termine al verificarsi di una condizione particolare che viene chiamata condizione di terminazione, che in genere si ha con particolari valori di input.

Page 6: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

6

LA RICORSIONE

Provate a scrivere un programma che richiama la ricorsione.

to ballo2 repeat 5 [fd 150 rt 360/5] ballo2end

Page 7: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

7

LA RICORSIONE

Impariamo delle nuove primitive: penpaint

Ritorna alla modalità classica di disegno

penerase La tartaruga cancella tutto quello che incontra.

wait numero Mette in pausa il programma per numero/60

secondi. (wait 120, mette in pausa per 2 s)

Page 8: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

8

LA RICORSIONE

to secondi fd 200 wait 60

penerase bk 200

penpaint rt 6

secondiend

Prima di scrivere questa procedura provate ad interpretare quello che accadrà durante l’esecuzione del programma.

Page 9: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

9

LA RICORSIONE

Scrivete una ricorsione che simuli una lancetta dei minuti.

Page 10: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

10

LA RICORSIONE

La primitiva print visualizza nell’area dello storico dei comandi (finestra in basso).

Questa primitiva aspetta un argomento, una lista o una parola:print 3print “ciaoprint [come stai?]

Provate a scrivere questa procedura:to stampa :n

print :n stampa :n+1end cosa succede?

Page 11: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

11

TERMINARE LA RICORSIONE

Gli esempi precedenti vengono eseguiti all’infinito consumando tutta la memoria disponibile (RAM).

Normalmente è possibile terminare la ricorsione, come? Vediamo un esempio.to stampa1 :n

if :n = 100 [stop] print :n stampa1 :n+1

end

Page 12: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

12

TERMINARE LA RICORSIONE

Nella procedura precedente vi è una nuova primitiva : if condizione [primitiva]. Questa primitiva è molto importante, perché permette di cambiare gli eventi nella procedura. Facciamo un esempio, digitate nella linea di comando:

if 2+1=3 [print [è vero]]# è vero

if 2+2=5 [print [è vero]]# (nessuna risposta)

Page 13: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

RICORSIONE: FIOCCO DI NEVE DI VAN KOCH

Utilizzando la ricorsione è molto semplice generare in Logo alcune semplici curve chiamate frattali in matematica.

Questi sono i primi passi per creare la linea spezzata di Van Koch:

1. Come primo passo si disegna un segmento di una data lunghezza.

2. Il segmento viene diviso in tre parti uguali.3. Un triangolo equilatero viene disegnato sul

segmento centrale.4. Infine il segmento centrale viene cancellato. 13

Page 14: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

Provate a scrivere in Logo questa prima parte del programma.

Il risultato dovrebbe essere la seguente figura 2:

Adesso provate a disegnare la figura 3.14

1 2 3 4

Page 15: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

Non tutte le vostre procedure permetteranno di trovare un algoritmo ricorsivo e quindi di continuare a spezzettare le linee sempre in tre parti uguali.

Come aiuto vi comunico le seguenti direttive:1. Disegniamo il segmento di lunghezza L e

corrispondente al passo n (Ln-1,L/3)

2. Ruotiamo a sinistra di 60°3. Disegniamo Ln-1,L/3

4. Ruotiamo a destra di 120°5. Disegniamo Ln-1,L/3

6. Ruotiamo a sinistra di 60°7. Disegniamo Ln-1,L/3

15

Page 16: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

Provate a scrivere una procedura che simuli i passaggi descritti nella diapositiva no. 15.

La soluzione la riceverete nel documento intitolato “Il fiocco di neve”

16

Page 17: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

RICORSIONE CON LE PAROLEImpariamo tre nuove primitive: Emptyp: restituisce vero se la variabile stringa è

vuota. print emptyp “ # true

print emptyp “logo # false Last: restituisce una parola costituita dall’ultima

lettera se arg1 è una parola o l’ultimo elemento se arg1 è un elenco.

print last ciao # oprint last [1 2 3 4] # 4

Butlast (bl): restituisce una parola privata dell’ultima lettera se arg1 è una parola o un elenco privato dell’ultimo elemento se arg1 è un elenco.

print butlast ciao # ciaprint butlast [1 2 3 4] # 1 2 3

17

Page 18: 1 PROGRAMMAZIONE IN LOGO 3 a e 4 a Lezione Programmare in scala e la ricorsione.

RICORSIONE CON LE PAROLE

Provate a scrivere una procedura ricorsiva che legga al contrario.La procedura viene invocata con:

inverti “mauro # oruam

18