Considera un vecchio problema ben noto :
In matematica, il massimo comune divisore (mcd) ... di due o più numeri interi diversi da zero, è il più grande intero positivo che divide i numeri senza resto.
La definizione di gcd è sorprendentemente semplice:

dove mod è l' operatore modulo (ovvero il resto dopo la divisione intera).
In inglese, questa definizione dice il massimo comun divisore di qualsiasi numero e zero è quel numero, e il massimo comun divisore di due numeri m ed n è il massimo comun divisore di n ed il resto dopo la divisione m dal n .
Se desideri sapere perché funziona, consulta l'articolo di Wikipedia sull'algoritmo euclideo .
Calcoliamo mcd (10, 8) come esempio. Ogni passaggio è uguale a quello immediatamente precedente:
- mcd (10, 8)
- mcd (10, 10 mod 8)
- mcd (8, 2)
- mcd (8, 8 mod 2)
- mcd (2, 0)
- 2
Nel primo passaggio, 8 non è uguale a zero, quindi si applica la seconda parte della definizione. 10 mod 8 = 2 perché 8 va in 10 una volta con un resto di 2. Al punto 3, la seconda parte si applica di nuovo, ma questa volta 8 mod 2 = 0 perché 2 divide 8 senza resto. Al passaggio 5, il secondo argomento è 0, quindi la risposta è 2.
Hai notato che gcd appare sia a sinistra che a destra del segno di uguale? Un matematico direbbe che questa definizione è ricorsiva perché l'espressione che stai definendo ricorre all'interno della sua definizione.
Le definizioni ricorsive tendono ad essere eleganti. Ad esempio, una definizione ricorsiva per la somma di un elenco è
sum l =
if empty(l)
return 0
else
return head(l) + sum(tail(l))
dove head
è il primo elemento in una lista ed tail
è il resto della lista. Nota chesum
ricorre all'interno della sua definizione alla fine.
Forse preferiresti invece il valore massimo in un elenco:
max l =
if empty(l)
error
elsif length(l) = 1
return head(l)
else
tailmax = max(tail(l))
if head(l) > tailmax
return head(l)
else
return tailmax
Potresti definire la moltiplicazione di interi non negativi in modo ricorsivo per trasformarla in una serie di aggiunte:
a * b =
if b = 0
return 0
else
return a + (a * (b - 1))
Se quella parte sulla trasformazione della moltiplicazione in una serie di aggiunte non ha senso, prova ad espandere alcuni semplici esempi per vedere come funziona.
L'ordinamento di fusione ha una bella definizione ricorsiva:
sort(l) =
if empty(l) or length(l) = 1
return l
else
(left,right) = split l
return merge(sort(left), sort(right))
Le definizioni ricorsive sono ovunque se sai cosa cercare. Notate come tutte queste definizioni abbiano casi base molto semplici, ad esempio , mcd (m, 0) = m. I casi ricorsivi riducono il problema per arrivare alle risposte facili.
Con questa comprensione, ora puoi apprezzare gli altri algoritmi nell'articolo di Wikipedia sulla ricorsione !