Come introdurre la programmazione nelle scuole secondarie?

La scelta del problema

Ma prima...

Un po' di riscaldamento sull'uso di python. Considereremo alcuni problemi da Project Euler (https://projecteuler.net/problems), per ognuno dei quali dovrete valutare:

  • scrivere una possibile soluzione,
  • valutare il valore didattico del problema in sé.

Problema 1

Se elenchiamo tutti i numeri naturali minori di dieci che sono multipli di 3 o di 5, otteniamo 3, 5, 6 e 9. La somma di tali multipli è 23.

Trovare la somma di tutti i multipli di 3 o di 5 minori di 1000.

Problema 2

Ogni nuovo elemento nella sequenza di Fibonacci è generato calcolando la somma dei due termini precedenti. Iniziando con 1 e 2, i primi 10 elementi saranno:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Considerando gli elementi nella sequenza di Fibonacci il cui valore non supera 4 milioni, trovare la somma di tutti gli elementi pari.

Problema 3

I fattori primi di 13195 sono 5, 7, 13 e 29.

Qual è il più grande fattore primo del numero 600851475143?

Problema 4

Un numero palindromo non cambia se viene letto al contrario. Il più alto numero palindromo ottenibile come prodotto di numeri di due cifre è 9009 = 91 × 99.

Trovare il più alto numero palindromo ottenibile come prodotto di numeri di tre cifre.

Problema 5

2520 è il più piccolo numero che può essere diviso per tutti i numeri da 1 a 10 senza ottenere resto.

Qual è il più piccolo numero positivo divisibile per tutti i numeri da 1 a 20 senza ottenere resto?

Problema 6

La somma dei quadrati dei primi dieci numeri naturali è

12 + 22 + ... + 102 = 385

Il quadrato della somma dei primi dieci numeri naturali è

(1 + 2 + ... + 10)2 = 552 = 3025

Dunque la differenza tra il quadrato della somma dei primi dieci numeri naturali e la somma dei quadrati degli stessi numeri è 3025 − 385 = 2640.

Trovare la differenza tra il quadrato della somma dei primi cento numeri naturali e la somma dei quadrati degli stessi numeri.

Possibili soluzioni e analisi

Problema 1

Se elenchiamo tutti i numeri naturali minori di dieci che sono multipli di 3 o di 5, otteniamo 3, 5, 6 e 9. La somma di tali multipli è 23.

Trovare la somma di tutti i multipli di 3 o di 5 minori di 1000.

Una soluzione del problema 1


sum([i for i in range(1000) if i % 3 == 0 or i % 5 == 0])
          

Ma andava bene anche...


n = 0
for i in range(1, 1000):
  if i % 5 == 0 or i % 3 == 0:
    n = n + i

print(n)
          

Valore del problema

Facile da formulare e da comprendere, non affrontabile senza PC.

Ma è difficile convincere gli studenti del fatto che la soluzione sia quella corretta.

Problema 2

Ogni nuovo elemento nella sequenza di Fibonacci è generato calcolando la somma dei due termini precedenti. Iniziando con 1 e 2, i primi 10 elementi saranno:

1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Considerando gli elementi nella sequenza di Fibonacci il cui valore non supera 4 milioni, trovare la somma di tutti gli elementi pari.

Una soluzione del problema 2


f = 1
f_prev = 1
f_prev_prev = 0

sum = 0

while(f<4000000):
  if f % 2 == 0:
    sum += f
  f_prev_prev = f_prev
  f_prev = f
  f = f_prev + f_prev_prev

print(sum)
          

Valore del problema

Come per il problema 1

Problema 3

I fattori primi di 13195 sono 5, 7, 13 e 29.

Qual è il più grande fattore primo del numero 600851475143 ?

Una soluzione del problema 3


import math

n = 600851475143
i = 2

while(i < math.sqrt(n)):
  while(n % i == 0):
    n = n / i

  i += 1

print(n)
          

Valore del problema

È facile convincere gli studenti del fatto che la soluzione non è sbagliata (basta verificare che l'output fornito sia primo e divisore del numero dato).

Posso sfidare gli studenti a chi trova il divisore primo più alto.

Problema 4

Un numero palindromo non cambia se viene letto al contrario. Il più alto numero palindromo ottenibile come prodotto di numeri di due cifre è 9009 = 91 × 99.

Trovare il più alto numero palindromo ottenibile come prodotto di numeri di tre cifre.

Una soluzione del problema 4


def reverse(s):
  return int(str(s)[::-1])

print(max([i*j for i in range(100, 1000) for j in range(100, 1000)
        if i*j == reverse(i*j)]))
            

Valore del problema

Come per il problema 3.

Il problema è percepibile più come enigmistico che come matematico.

Problema 5

2520 è il più piccolo numero che può essere diviso per tutti i numeri da 1 a 10 senza ottenere resto.

Qual è il più piccolo numero positivo divisibile per tutti i numeri da 1 a 20 senza ottenere resto?

Una soluzione del problema 5


def mcd(a, b):
  return b and mcd(b, a%b) or a

def mcm(a, b):
  return a * b / mcd(a, b)

n = 1
for i in range(1, 21):
  n *= mcm(n, i)

print(n)
            

Valore del problema

Come per il problema 4.

La soluzione offre uno spunto interdisciplinare con la matematica.

Problema 6

La somma dei quadrati dei primi dieci numeri naturali è

12 + 22 + ... + 102 = 385

Il quadrato della somma dei primi dieci numeri naturali è

(1 + 2 + ... + 10)2 = 552 = 3025

Dunque la differenza tra il quadratto della somma dei primi dieci numeri naturali e la somma dei quadrati degli stessi numeri è 3025 − 385 = 2640.

Trovare la differenza tra il quadrato della somma dei primi cento numeri naturali e la somma dei quadrati degli stessi numeri.

Una soluzione del problema 6


def sumsq(n):
  return n * (n+1) * (2*n+1) / 6

def sqsum(n):
  return (n * (n+1) / 2) ** 2

print(sqsum(100) - sumsq(100))
            

Valore del problema

Come per il problema 5

Scelta del problema

Approccio tipico

Ti insegno a scrivere un programma che stampa i primi dieci valori della sequenza di Fibonacci


$ ./fibo
1 1 2 3 5 8 13 21 34 55
$
          

Che reazione ci possiamo aspettare?

  • A che cosa mi serve?
  • Non faccio prima a calcolare a mente e scrivere su carta?

Almeno all'inizio...

...è difficile partire da problemi cool su grandi moli di dati. È comunque bene

  • Sottolineare che uno dei valori dell'approccio informatico sta nell'automatizzazione della soluzione dei problemi
  • Cercare ove possibile di far lavorare gli studenti
    • in contesti pratici e alla loro portata
    • su problemi che non sanno affrontare o automatizzare
    • e di cui è loro chiaro il valore della soluzione

Se questo non è possibile

Stringere un patto formativo con gli studenti

Per esempio: arriveremo a produrre questo:

Mappa di tweet geolocalzzati con un particolare hashtag