Una funzione ricorsiva � una funzione che chiama s� stessa pi� volte. Puo essere utile ad esempio quando � necessario effettuare pi� volte un'operazione su dei dati. Vediamo un esempio per chiarire meglio come questa tipoligia di funzioni venga implementata nella bash.
Consideriamo l'algoritmo di Euclide, che calcola il massimo comune divisore tra due numeri M e N. L'algoritmo, schematicamente, ha questa struttura:
if [ N = 0 ]
M � il MCD
else
calcola il resto R di M/N
if [ R = 0 ]
MCD = R
else
scambia M e N
ripeti da inizio
fi
fi
e pu� essere implementato in uno script di questo tipo:
#!/bin/bash
# Definisco le variabili per exit
EXIT_SUCCESS=0
EXIT_FAILURE=1
utilizzo()
{
echo
echo "Utilizzo della funzione:"
echo "$(basename $0) <primo numero> <secondo numero>"
echo
exit $EXIT_FAILURE
}
mcd ()
{
# Assegna come nuovi m e n i valori passati
# dall'ultima chiamata
m=$1
n=$2
# Verifica che m e n siano validi, o che
# non sia stata raggiunta la fine
# dell'algoritmo
if [ $n -eq 0 -a $m -eq 0 ]; then
echo "mcd(0,0) non � definito!"
exit $EXIT_FAILURE
elif [ $m -eq 0 ]; then
return $n
elif [ $n -eq 0 ]; then
return $m
fi
# Chiamata ricorsiva della funzione
# Il primo parametro � il resto di $n / $m,
# Il secondo � $m.
# Notiamo come $m e $n vengano continuamente
# invertiti.
mcd $(( $n % $m )) $m
}
########################
# Programma principale #
########################
# Controllo di sicurezza: se il numero di valori
# passati non � 2, mostra l'utilizzo di questo
# script
if [ $# -ne 2 ]; then
usage
fi
# Chiama la funzione mcd, e gli passa come parametri i valori
# scritti a riga di comando al momento dell'esecuzione dello
# script
mcd $1 $2
# Stampa i risultati
MCD=$?
echo "Il mcd di \"$1\" e \"$2\" �: $MCD"
exit $EXIT_SUCCESS