50 Sfumature di Fibonacci
di Cristiano Piemontese (aka B.A.G.G)
N.B. purtroppo non sono davvero 50 versioni di Fibonacci...
Mentre sperimentavo per prendere confidenza con bash il mio pensiero è subito volato alla tanto amata ricorsione e allora ho deciso che era il momento di provare a implementare Fibonacci, nella sua versione con ricorsione di coda (già è lenta questa, figuriamoci la versione normale...), in bash: le due versioni sono quasi equivalenti nel codice utilizzato, ma è comunque stato utile realizzarle entrambe per capire meglio l'uso del linguaggio...
Script ricorsivi:
Questa versione si compone di due script: un "interfaccia" con la quale l'utente può chiamare Fibonacci nella versione consueta, cioè col solo parametro n; l'algoritmo effettivo che calcola Fibonacci, cioè uno script che richiama se stesso coi parametri aggiornati:
script Interfaccia:
#!/bin/bash
usagerr=-1
if [[ -z $1 ]]
then
echo "Usage: ./fib.sh num (other arguments will not be considered)"
exit $usagerr
elif [[ $1 -lt 0 ]]
then
echo "num must be >= 0"
exit $usagerr
elif [[ $1 -eq 0 ]]
then
echo "0"
elif [[ $1 -ge 1 ]]
then
echo $(./fibtr.sh $1 1 1)
fi
exit 0
script Algoritmo:
#!/bin/bash
n=$1
f1=$2
f2=$3
if [[ $1 -le 2 ]]
then
echo "$f1"
else
tmp=$f2
f2=$f1
f1=`expr $f1 + $tmp`
n=`expr $n - 1`
echo $(./fibtr.sh $n $f1 $f2)
fi
exit 0
Funzioni bash ricorsive:
Questa versione include in un unico script entrambe le funzioni, cioè la "funzioni interfaccia" e la funzione vera e propria:
#!/bin/bash
if [[ -z $1 ]]
then
echo "Usage: ./fibfunc.sh num (other arguments will not be considered)"
exit -1
n=$1
f1=1
f2=1
fib () {
if [[ $1 -lt 0 ]]
then
echo "num must be greater than zero!"
elif [[ $1 -eq 0 ]]
then
echo "0"
else
echo $(fibtr $n 1 1)
fi
}
fibtr () {
if [[ $1 -le 2 ]]
then
echo $f1
else
tmp=$f2
f2=$f1
f1=`expr $f1 + $tmp`
n=`expr $n - 1`
echo $(fibtr $n $f1 $f2)
fi
}
echo $(fib $n)
exit 0