domenica 11 novembre 2012

Mission Python: Le funzioni. Parte terza

Ancora funzioni?
Sì, ci sono ancora parecchie cose da dire, mi sa che neanche oggi finiamo. Ma in fondo siamo entrati nel cuore della programmazione. E poi vogliamo arrivare alla grafica (finestre, pulsanti, etc)? Ecco lì sarà tutto una funzione! E allora ecco...

Una funzione può essere ricorsiva, cioè chiamare se stessa. Di solito si illustra la ricorsività con la definizione di fattoriale. Proprio come faremo noi, subito-subito.

Si definisce fattoriale di N, indicandolo con N!, il prodotto di 1 * 2 * 3 * ... (N-1) * N. Se N è uguale a 0 o 1, allora N! = 1. I matematici riescono a far saltare fuori il fattoriale dove meno te lo aspetti e allora seguiamoli.

Allora se rileggiamo la definizione per N > 1, si ha che N! = N * (N-1)!, cioè è una funzione ricorsiva.

Per rendere la cosa meno monotona (in fondo vogliamo imparare Python, non solo la mate) introduciamo una variabile built-in (cioè predefinita), argv, che si trova nel modulo sys.

È una lista (ne riparleremo), facciamo qualche prova (arg.py):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

argomenti = sys.argv
numarg = len(sys.argv)
if  numarg > 0:
 for a in argomenti:
  print a

Allora vediamo che ci sono cose interessanti: il primo argomento (quello numero 0) è il nome dello script; ogni argomento è una parola; le virgolette, sia semplici che doppie raggruppano le parole; volendo (provate voi) si possono raggruppare le parole mettendo un \ immediatamente prima dello spazio o del tab o degli altri caratteri speciali.

OK, siamo pronti per il calcolo del fattoriale (fact.py):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

def factorial(n):
 if n in (0, 1):
  return n
 else:
  return n * factorial(n - 1)
  
argomenti = sys.argv
if  len(sys.argv) > 0:
 n = int(sys.argv[1])
 print str(n) + '! =', factorial(n)

C'è una congettura (detta di Collatz) che dice: per qualunque numero intero positivo se pari dividi per 2 se dispari moltiplica per 3 e aggiungi 1; ripeti e arriverai sempre a uno. Con Python è semplicissimo, vero, ecco la mia versione (collatz.py)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

def collatz(n):
    print n,
    if n > 1:
        if n % 2 == 0:
            n /= 2
        else:
            n = 3 * n + 1
        collatz(n)

# main
if len(sys.argv) == 1:
    print "Uso: collatz numero\n"
    sys.exit(1)

num = int(sys.argv[1])
collatz(num)
print

Solo una cosa: mettendo una virgola alla fine della print si elimina l'a-capo.

Articolo dell'amico Juhan cui va tutta la mia stima e che ringrazio pubblicamente per il corso di Python...Alla fine è lui il maestro...e non io. Per me è una gioia pubblicare i suoi post su questo blog. ;-)

Dimenticavo, l'indice di Mission Python lo trovate qui.

1 commento: