Risolto spiegazione esercizio python

Stato
Discussione chiusa ad ulteriori risposte.

markito

Utente Iron
3 Marzo 2021
17
2
9
Codice:
import turtle

bob=turtle.Turtle()

def koch(t, n):
    """disegna una curva di Koch di lunghezza n."""
    if n < 10:
        t.fd(n)
        return
    m = n/3
    koch(t, m)
    t.lt(60)
    koch(t, m)
    t.rt(120)
    koch(t, m)
    t.lt(60)
    koch(t, m)
    
koch(bob,200)

Salve a tutti, faccio questa domanda per chiedere chiarimenti riguardo un esercizio e penso una spiegazione più approfondita del comando 'return' in questo contesto.
La funzione scritta sopra disegna una curva di Koch, una figura frattale che viene costruita con il seguente schema:
  • Partendo da un segmento di determinata lunghezza
    1. dividere il segmento in tre segmenti uguali;
    2. cancellare il segmento centrale, sostituendolo con due segmenti identici che costituiscono i due lati di un triangolo equilatero;
    3. tornare al punto 1 per ognuno degli attuali segmenti.
se potete date un occhiata a questo link per avere un idea della figura in questione: https://it.wikipedia.org/wiki/Curva_di_Koch .

Nonostante la funzione svolga il suo lavoro, non capisco come l'interprete la esegua; cercherò di spiegare quello che penso di aver capito:
partendo dal 200 (valore casuale dato da me) la funzione la divide per 3, si richiama da sola, divide ancora per 3 e così via finchè non raggiunge un valore inferiore di 10 (nel mio caso circa 7), lo disegna come linea retta, gira a sinistra di 60°, ridisegna un piccolo segmento, gira di 120°, altro segmento, gira di 60°, facendo un altro segmento, non capisco però come faccia ad andare avanti, ovvero girando ulteriormente di 60° per poi rifare ulteriori ''set'' di altri 4 piccoli segmenti e così via fino formare la curva di Koch vera e propria.

in allegato vi lascio anche un sito che prova il codice: https://trinket.io/turtle/f54fe04ddd .

Spero abbiate capito la mia difficoltà e grazie in anticipo per le risposte.
 

St3ve

Utente Platinum
12 Ottobre 2011
2,113
1,406
665
Ultima modifica:
È una funzione ricorsiva. Concettualmente funziona esattamente come l'hai descritta tu: dato un segmento, dividi la sua lunghezza in tre e disegni una specie di triangolo _/\_ costituito da quattro segmenti. Adesso che hai quattro segmenti, puoi ripetere lo stesso procedimento per ognuno di essi e andare avanti potenzialmente anche all'infinito. Invece di continuare a sbriciolare ogni segmento triangolo in pezzi sempre più piccoli, stabilisci che i segmenti piccoli (n < 10) rimangono tali.

In pratica non disegni un triangolo per poi spezzarlo. L'unica cosa che tracci sono i segmenti più piccoli, perché ogni chiamata (ricorsiva) alla funzione kotch deve risolversi completamente prima di passare la riga di codice successiva. Supponendo n=81, almeno mi vengono numeri interi, possiamo schematizzare in questo modo:
Codice:
                         81                   
    27            27            27            27
9  9  9  9    9  9  9  9    9  9  9  9    9  9  9  9
  • Il segmento 81 scopre che al suo interno ha un segmento 27. Il segmento 27 scopre che al suo interno ha un segmento 9. Il segmento 9 viene disegnato.
  • Adesso si ritorna al segmento 27, che svolta di 60 gradi e scopre il secondo segmento 9. Il segmento 9 viene disegnato.
  • Adesso si ritorna al segmento 27 che svolta di altri 60 gradi e scopre un altro segmento 9. Il segmento 9 viene disegnato.
  • Adesso si ritorna al segmento 27 che svolta di altri 60 gradi e scopre un altro segmento 9. Il segmento 9 viene disegnato.
  • Adesso si ritorna al segmento 27 che è stato completamente disegnato e torna al segmento 81, che svolta di 60 gradi e scopre che al suo interno ha un altro segmento 27. Il segmento 27 scopre che al suo interno ha un segmento 9. Il segmento 9 viene disegnato.
  • eccetera eccetera...
Sostanzialmente, per disegnare una curva lunga 81 devo disegnare quattro curve lunghe 27. Per disegnare una curva lunga 27 devo disegnare quattro curve lunghe 9. Le curve lunghe 9 sono un semplice segmento che possiamo disegnare con t.fd(9).

Prima di disegnare di disegnare la seconda curva lunga 27 devo disegnare tutta la prima curva lunga 27 (...che mi richiede di disegnare quattro curve lunghe 9).

Volevo colorare anche l'albero, ma non si può colorare all'interno del blocco code e se lo tolgo perdo gli spazi. Supponi che ogni numero sia colorato in modo diverso e che se due numeri uguali sono colorati allo stesso modo identificano lo stesso segmento. Chiaro?
 

markito

Utente Iron
3 Marzo 2021
17
2
9
È una funzione ricorsiva. Concettualmente funziona esattamente come l'hai descritta tu: dato un segmento, dividi la sua lunghezza in tre e disegni una specie di triangolo _/\_ costituito da quattro segmenti. Adesso che hai quattro segmenti, puoi ripetere lo stesso procedimento per ognuno di essi e andare avanti potenzialmente anche all'infinito. Invece di continuare a sbriciolare ogni segmento triangolo in pezzi sempre più piccoli, stabilisci che i segmenti piccoli (n < 10) rimangono tali.

In pratica non disegni un triangolo per poi spezzarlo. L'unica cosa che tracci sono i segmenti più piccoli, perché ogni chiamata (ricorsiva) alla funzione kotch deve risolversi completamente prima di passare la riga di codice successiva. Supponendo n=81, almeno mi vengono numeri interi, possiamo schematizzare in questo modo:
Codice:
                         81                  
    27            27            27            27
9  9  9  9    9  9  9  9    9  9  9  9    9  9  9  9
  • Il segmento 81 scopre che al suo interno ha un segmento 27. Il segmento 27 scopre che al suo interno ha un segmento 9. Il segmento 9 viene disegnato.
  • Adesso si ritorna al segmento 27, che svolta di 60 gradi e scopre il secondo segmento 9. Il segmento 9 viene disegnato.
  • Adesso si ritorna al segmento 27 che svolta di altri 60 gradi e scopre un altro segmento 9. Il segmento 9 viene disegnato.
  • Adesso si ritorna al segmento 27 che svolta di altri 60 gradi e scopre un altro segmento 9. Il segmento 9 viene disegnato.
  • Adesso si ritorna al segmento 27 che è stato completamente disegnato e torna al segmento 81, che svolta di 60 gradi e scopre che al suo interno ha un altro segmento 27. Il segmento 27 scopre che al suo interno ha un segmento 9. Il segmento 9 viene disegnato.
  • eccetera eccetera...
Sostanzialmente, per disegnare una curva lunga 81 devo disegnare quattro curve lunghe 27. Per disegnare una curva lunga 27 devo disegnare quattro curve lunghe 9. Le curve lunghe 9 sono un semplice segmento che possiamo disegnare con t.fd(9).

Prima di disegnare di disegnare la seconda curva lunga 27 devo disegnare tutta la prima curva lunga 27 (...che mi richiede di disegnare quattro curve lunghe 9).

Volevo colorare anche l'albero, ma non si può colorare all'interno del blocco code e se lo tolgo perdo gli spazi. Supponi che ogni numero sia colorato in modo diverso e che se due numeri uguali sono colorati allo stesso modo identificano lo stesso segmento. Chiaro?
Chiarissimo, grazie. Il mio errore era di pensare che il comando return di koch(t,9) del tuo esempio rimandasse direttamente alla funzione iniziale koch(t,81) invece di koch(t,27).
Grazie ancora
 
Banner pubblicitario per Bright Data su Inforge.net azienda di vendita Proxy, Data Collector e Content Unlocker
Supporta Inforge con una donazione
Stato
Discussione chiusa ad ulteriori risposte.