Guida avanzata di scripting Bash: Un'approfondita esplorazione dell'arte dello scripting di shell | ||
---|---|---|
Indietro | Capitolo 23. Funzioni | Avanti |
Una funzione può richiamare se stessa ricorsivamente anche senza l'impiego di variabili locali.
Esempio 23-14. La torre di Hanoi
#! /bin/bash # # La Torre di Hanoi # Script Bash # Copyright (C) 2000 Amit Singh. Tutti i diritti riservati. # http://hanoi.kernelthread.com # # Ultima verifica eseguita con la versione bash 2.05b.0(13)-release # # Usato in "Advanced Bash Scripting Guide" #+ con il permesso dell'autore dello script. # Commentato e leggermente modificato dall'autore di ABS. #========================================================================# # La Torre di Hanoi è un rompicapo matematico attribuito a #+ Edouard Lucas, matematico francese del XIX secolo. # # Ci sono tre pioli verticali inseriti in una base. # Nel primo piolo è impilata una serie di anelli rotondi. # Gli anelli sono dei dischi piatti con un foro al centro, #+ in modo che possano essere infilati nei pioli. # I dischi hanno diametri diversi e sono impilati in ordine #+ decrescente in base alla loro dimensione. # Quello più piccolo si trova nella posizione più alta, #+ quello più grande alla base. # # Lo scopo è quello di trasferire la pila di dischi #+ in uno degli altri pioli. # Si può spostare solo un disco alla volta. # È consentito rimettere i dischi nel piolo iniziale. # È permesso mettere un disco su un altro di dimensione maggiore, #+ ma *non* viceversa. # Ancora, è proibito collocare un disco su uno di minor diametro. # # Con un numero ridotto di dischi, sono necessari solo pochi spostamenti. #+ Per ogni disco aggiuntivo, #+ il numero degli spostamenti richiesti approssimativamente raddoppia #+ e la "strategia" diventa sempre più complessa. # # Per ulteriori informazioni, vedi http://hanoi.kernelthread.com. # # # ... ... ... # | | | | | | # _|_|_ | | | | # |_____| | | | | # |_______| | | | | # |_________| | | | | # |___________| | | | | # | | | | | | # .--------------------------------------------------------------. # |**************************************************************| # #1 #2 #3 # #========================================================================# E_NOPARAM=66 # Nessun parametro passato allo script. E_ERR_PARAM=67 # Il numero di dischi passato allo script non è valido. Mosse= # Variabile globale contenente il numero degli spostamenti. # Modifiche allo script originale. eseguehanoi() { # Funzione ricorsiva. case $1 in 0) ;; *) eseguehanoi "$(($1-1))" $2 $4 $3 echo sposto $2 "-->" $3 let "Mosse += 1" # Modifica allo script originale. eseguehanoi "$(($1-1))" $4 $3 $2 ;; esac } case $# in 1) case $(($1>0)) in # Deve esserci almeno un disco. 1) eseguehanoi $1 1 3 2 echo "Totale spostamenti = $Mosse" exit 0; ;; *) echo "$0: numero di dischi non consentito"; exit $E_ERR_PARAM; ;; esac ;; *) echo "utilizzo: $0 N" echo " Dove \"N\" è il numero dei dischi." exit $E_NOPARAM; ;; esac # Esercizi: # --------- # 1) Eventuali comandi posti in questo punto verrebbero eseguiti? # Perché no? (Facile) # 2) Spiegate come agisce la funzione "eseguehanoi". # (Difficile) |