50 Sfumature di Fibonacci

From Sistemi Operativi
Jump to navigation Jump to search

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