IMC!


Contenuti


Foto

 







Curiosando...
Novita  Novità Link  Link Blog  Blog English  Español 
13 - Script ricorsivi nella bash

 | 

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
 


 | 






Fatal error: Call to undefined function sqlite_open() in /membri/giacobbe85/include/commenti.inc.php on line 324