Difference between revisions of "50 Sfumature di Fibonacci"

From Sistemi Operativi
Jump to navigation Jump to search
 
 
Line 1: Line 1:
 
==di Cristiano Piemontese (aka B.A.G.G)==
 
==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...
 
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...
Line 8: Line 10:
  
 
<source lang="bash">
 
<source lang="bash">
     Interfaccia:
+
     script Interfaccia:
  
 
#!/bin/bash
 
#!/bin/bash
Line 32: Line 34:
  
  
     Algoritmo:
+
     script Algoritmo:
  
 
#!/bin/bash
 
#!/bin/bash

Latest revision as of 17:56, 8 April 2015

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