Forum >> Principianti >> Curva di Koch

Pagina: 1

Ho da qualche giorno iniziato a studiare sul libro 'pensare in python' e mi sono imbattuto in un esercizio che chiede di scrivere una funzione che attraverso turtle disegni una curva di koch. Probabilmente non ho chiarissime le meccaniche della ricorsione, ma non riesco a capire come sia possibile che questo programma riesca a fare quanto detto, soprattutto dato il fatto che manca l'istruzione che dica a turtle di andare avanti:

import turtle


def koch(t, n):
    """Draws a koch curve with length 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)

Inoltre ho notato che togliendo l'istruzione if dal programma questo entra in una ricorsione infinita quando mi pare di capire che in questo caso serva solo a bloccare l'esecuzione nel caso si inserisca un valore di n minore di dieci, sbaglio? Grazie mille in anticipo


--- Ultima modifica di ㎝ in data 2017-01-27 15:18:11 ---
Ho da qualche giorno iniziato a studiare sul libro 'pensare in python' e mi sono imbattuto in un esercizio che chiede di scrivere una funzione che attraverso turtle disegni una curva di koch. Probabilmente non ho chiarissime le meccaniche della ricorsione, ma non riesco a capire come sia possibile che questo programma riesca a fare quanto detto, soprattutto dato il fatto che manca l'istruzione che dica a turtle di andare avanti:
Non è vero, turtle.fd(n) muove la tartaruga avanti di n pixel.

import turtle


def koch(t, n):
    """Draws a koch curve with length 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)
Inoltre ho notato che togliendo l'istruzione if dal programma questo entra in una ricorsione infinita quando mi pare di capire che in questo caso serva solo a bloccare l'esecuzione nel caso si inserisca un valore di n minore di dieci, sbaglio?

Sì (nel senso di "sì, sbagli" ;). Oltre a fermare la ricorsione, il passo base (sovente gli algoritmi ricorsivi sono espressi in termine di una condizione di uscita (detta appunto "passo base") e l'elaborazione ricorsiva vera e propria (chiamata "passo ricorsivo")) disegna anche un segmento della curva.
Se elimini il passo base non esci mai dalla catena di chiamate (ok, non è vero: Python ha un parametro sys.getrecursionlimit che impedisce l'esplosione del pc).
Per verificarne il comportamento, prova a chiamare la funzione per valori di n pari a 9 (disegna un semplice trattino lungo 9), 27 (disegna la curva base), 81 (iterazione successiva), e così via...

Grazie mille in anticipo

Prego,



--- Ultima modifica di ㎝ in data 2017-01-27 15:51:19 ---
THE 🍺-WARE LICENSE (Revision ㊷):
<carlo@🐍.it> wrote this post. As long as you retain this notice you
can do whatever you want with this stuff. If we meet some day, and you
think this stuff is worth it, you can buy me a 🍺 in return. -- ㎝
Grazie ancora per la risposta. Finalmente ho capito cosa sbagliavo, non calcolavo che ad ogni chiamata il valore di n doveva essere diviso per 3, e quindi la funzione perdeva di senso.

--- Ultima modifica di openedelko in data 2017-01-27 18:00:08 ---


Pagina: 1



Esegui il login per scrivere una risposta.