Une fonction peut s'appeller récursivement sans même utiliser de variables locales.
Exemple 23.14. Les tours d'Hanoi
#! /bin/bash
#
# La tour d'Hanoi
# Script bash
# Copyright (C) 2000 Amit Singh. All Rights Reserved.
# http://hanoi.kernelthread.com
#
# Dernier test avec bash version 2.05b.0(13)-release
#
# Utilisé dans le "Guide d'écriture avancé des scripts Bash"
#+ Avec l'autorisation de l'auteur du script.
# Légèrement modifié et commenté par l'auteur d'ABS.
#=================================================================#
# La tour d'Hanoi est un puzzle mathématique attribué à Édouard Lucas,
#+ un mathématicien français du 19è siècle.
# Il y a un ensemble de trois positions verticales dans une base.
# Le premier poste dispose d'un ensemble d'anneaux empilés.
# Les anneaux sont des disques plats avec un trou en leur centre,
#+ de manière à être placés sur les batons.
# Les anneaux ont des diamètres différents et ils s'assemblent en ordre
#+ descendant suivant leur taille.
# La plus petite est au-dessus et la plus large à la base.
#
# Le problème consiste à transférer la pile d'anneaux d'un baton à un autre.
# Vous pouvez bouger seulement un anneau à la fois.
# Il vous est permis de replacer les anneaux à leur baton d'origine.
# Vous pouvez placer un petit anneau sur un plus gros mais pas le contraire.
# Encore une fois, il est interdit de placer un gros anneau sur un plus petit.
#
# Pour un petit nombre d'anneaux, seuls quelques mouvements sont nécessaires.
#+ Pour chaque anneau supplémentaire, le nombre de déplacements requis double
#+ approximativement et la "stratégie" devient de plus en plus complexe.
#
# Pour plus d'informations, voir http://hanoi.kernelthread.com.
#
#
# ... ... ...
# | | | | | |
# _|_|_ | | | |
# |_____| | | | |
# |_______| | | | |
# |_________| | | | |
# |___________| | | | |
# | | | | | |
# .--------------------------------------------------------------.
# |**************************************************************|
# #1 #2 #3
#
#=================================================================#
E_SANSPARAM=66 # Aucun paramètre passé au script.
E_MAUVAISPARAM=67 # Nombre illégal de disques.
Deplacements= # Variable globale contenant le nombre de déplacements.
# Modifications du script original.
fait_hanoi() { # Fonction récursive.
case $1 in
0)
;;
*)
fait_hanoi "$(($1-1))" $2 $4 $3
echo move $2 "-->" $3
let "Deplacements += 1" # Modification du script original.
fait_hanoi "$(($1-1))" $4 $3 $2
;;
esac
}
case $# in
1)
case $(($1>0)) in # Il doit y avoir au moins un disque.
1)
fait_hanoi $1 1 3 2
echo "Nombre total de déplacements = $Deplacements"
exit 0;
;;
*)
echo "$0: valeur illégale pour le nombre de disques";
exit $E_MAUVAISPARAM;
;;
esac
;;
*)
echo "usage: $0 N"
echo " où \"N\" est le nombre de disques."
exit $E_SANSPARAM;
;;
esac
# Exercices:
# ---------
# 1) Est-ce que les commandes au delà de ce point seront exécutées ?
# Pourquoi ? (Facile)
# 2) Expliquer le fonctionnement de la fonction "fait_hanoi".
# (Difficile)