50 Sfumature di Fibonacci

From Sistemi Operativi
Revision as of 18:56, 8 April 2015 by BAGG (talk | contribs) (→‎di Cristiano Piemontese (aka B.A.G.G))
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
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