Topic: Aiuto con questo esercizio  (Letto 295 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline soap88

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Aiuto con questo esercizio
« il: Aprile 04, 2020, 11:58 »
Ciao ragazzi, sto facendo alcuni esercizi per imparare Python. Mi sono imbattuto in questo che non riesco a fare, non riesco nemmeno ad impostare. Immagino si debba fare una ricorsione di funzione, ma non so cosa scrivere nella funzione iniziale mcd(a, b).
Mi date una mano?

ll massimo comun divisore (MCD) di due interi a e b è il numero intero più grande che divide entrambi senza dare resto. Un modo per trovare il MCD di due numeri si basa sull’osservazione che, se r è il resto della divisione tra a e b, allora mcd(a, b) = mcd(b, r). Come caso base, possiamo usare mcd(a, 0) = a.
Scrivete una funzione di nome mcd che abbia come parametri a e b e restituisca il loro massimo comun divisore.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.112
  • Punti reputazione: 9
    • Mostra profilo
Re:Aiuto con questo esercizio
« Risposta #1 il: Aprile 04, 2020, 14:17 »
Puoi facilitarti la vita sapendo che la funzione divmod restituisce quoziente e resto della divisione tra due interi:

>>> divmod(5, 2)
(2, 1)

Per il resto, ricorsione compresa, devi lavorare con carta e penna e un po' di pazienza.

Offline soap88

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re:Aiuto con questo esercizio
« Risposta #2 il: Aprile 04, 2020, 14:51 »
OK, grazie partirò da da qui  :)
Potresti inoltre consigliarmi qualche link dove viene spiegata bene la ricorsione? A me è chiara solo fino ad un certo punto.

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.112
  • Punti reputazione: 9
    • Mostra profilo
Re:Aiuto con questo esercizio
« Risposta #3 il: Aprile 04, 2020, 17:56 »
su che libro stai imparando python? ...da qualche parte quell'esercizio l'avrai pur preso...

Offline soap88

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re:Aiuto con questo esercizio
« Risposta #4 il: Aprile 08, 2020, 11:26 »
Sto studiando da Thinking in Python. Tuttavia mi è poco chiara la spiegazione data lì.
Per esempio con questo esercizio:
scrivete una funzione di nome fai_n che accetti come argomenti un oggetto funzione e un numero n, e che chiami per n volte la funzione data. (la funzione data è stampa_n) il codice è questo:
 
def stampa_n(s, n):
    if n <= 0:
        return
    print(s)
    stampa_n(s, n-1)
# stampa_n('ciao', 4)

def fai_n(f, n):
     f(n)
fai_n(stampa_n, 4)


Ma ottengo questo errore:
TypeError: stampa_n() missing 1 required positional argument: 'n'

Ho cercato di modificare in questo modo, funziona, ma è corretto?
def fai_n(f, s, n):
     f(s, n)

fai_n(stampa_n, 'ciao', 4)


E poi una cosa che non mi è chiara, quando passo le funzioni come argomento di altre funzioni, perchè si omettono le parentesi tonde? Forse è una domanda stupida, ma proprio non capito perchè si fa così  :(
« Ultima modifica: Aprile 08, 2020, 12:12 da soap88 »

Offline RicPol

  • python sapiens sapiens
  • ******
  • Post: 3.112
  • Punti reputazione: 9
    • Mostra profilo
Re:Aiuto con questo esercizio
« Risposta #5 il: Aprile 08, 2020, 22:01 »
Guarda, i libri gratis molto spesso valgono quello che costano... Thinking in Python è l'eccezione: vale molto, molto molto meno di quello che costa.
Ormai ho perso il conto dei principianti che quel libro ha guastato. A un certo punto mi ero pure messo in testa di scrivere una serie di articoli per fare le pulci a quel libro... ne avevo scritto uno https://pythoninwindows.blogspot.com/2019/05/non-pensare-da-informatico.html (guarda caso c'entra la ricorsione anche qui), e poi però mi ero fermato... ma in effetti il capitolo sulle funzioni è *TERRIFICANTE*, un vero e proprio abisso di stupidità. Dovrei davvero scrivere qualcosa su quel capitolo. Fa piangere il cuore.

> Ho cercato di modificare in questo modo, funziona, ma è corretto?
funziona ed è corretto, pur nel quadro della totale assurdità di tutto il discorso

> E poi una cosa che non mi è chiara, quando passo le funzioni come argomento di altre funzioni,
> perchè si omettono le parentesi tonde? Forse è una domanda stupida
Non è una domanda stupida... è stupido che quel libro non ti spieghi le cose essenziali. Una funzione, tecnicamente, è un oggetto. Un oggetto che si può eseguire. Il nome di una funzione è l'handle (la "maniglia") per quell'oggetto. Rappresenta quell'oggetto. Quando tu scrivi qualcosa, qualsiasi cosa, l'interprete di Python lo deve *valutare*, e deve darti un risultato. Un po' come quando alle elementari la maestra scriveva "2+2" e tu valutavi quell'espressione e la sostituivi con "4" (se eri bravo). Quando tu scrivi il *nome* di una funzione, Python valuta quello che scrivi, e dice: ok, questo è l'oggetto-funzione. Quando tu scrivi il nome della funzione seguito da parentesi, Python valuta quello che scrivi e dice: ok, adesso questo è l'oggetto-funzione *eseguito*. Allora *esegue* la funzione (con gli argomenti eventualmente presenti tra parentesi) e sostituisce la tua espressione con il risultato dell'esecuzione dell'oggetto-funzione. Quando tu passi una funzione a un'altra funzione, quello che vuoi passare è appunto l'oggetto-funzione, non certo il risultato della sua esecuzione. Ecco perché non usi le parentesi.

Ora, il problema è che non posso davvero mettermi a scrivere un manuale di Python sotto forma di post in un forum. Per fortuna il problema ha una soluzione facilissima: butta nel cesso quel libro, e investi un briciolo di denaro in un libro decente. Non te ne pentirai. Il Lutz è sempre la scelta che mi sento di consigliare.

Offline soap88

  • python unicellularis
  • *
  • Post: 4
  • Punti reputazione: 0
    • Mostra profilo
Re:Aiuto con questo esercizio
« Risposta #6 il: Aprile 10, 2020, 10:13 »
Beh che dire, sei stato  molto schietto ma al contempo molto esplicativo  :)
Ti ringrazio di cuore e seguirò il tuo consiglio cambiando libro ;)
Solo una domanda, mi consigli qualche link dove posso trovare gli esercizi?
« Ultima modifica: Aprile 10, 2020, 10:42 da soap88 »