#include <stdio.h>

enum tour {R,V,B};
typedef enum tour Tour;

void hanoi(int,Tour,Tour,Tour);
char * traduit(Tour);

char * traduit(Tour une_tour)
{
   switch (une_tour)
   {
      case R : return "rouge";
      case V : return "verte";
      case B : return "bleue";
   }
}

void hanoi (int n, Tour origine, Tour destination, Tour intermediaire)
{
   if (n>0)
   {
      hanoi(n-1,origine,intermediaire,destination);
      printf("transportez l'anneau qui est en haut de la tour %s "
              "vers la tour %s\n",traduit(origine),traduit(destination));
      hanoi(n-1,intermediaire,destination,origine); }
}

void main()
{
   int nbr_anneaux ;

   printf("Avec combien d'anneaux voulez-vous jouer ? "
         "Attention 8 est un maximum\n");
   scanf("%d",&nbr_anneaux);
   hanoi(nbr_anneaux,R,V,B);
}
Tour une_tour;

Cette déclaration définit la variable une_tour, qui est de "type" Tour, donc du "type" enum tour, donc du type int.

void hanoi (int n, Tour origine, Tour destination, Tour intermediaire)
La fonction hanoi est dite récursive, ce qui signifie qu'elle s'appelle elle-même.

Pour transporter n disques d'une tour "origine" à une tour "destination" en utilisant une tour "intermédiaire", il suffit de :

C'est exactement ce qui est décrit dans la fonction hanoi ; cette description nécessite la récursivité.

if (n>0)
Cette condition est le "test d'arrêt" sur les appels récursifs. Il faut se méfier, avec une fonction récursive, de ne pas oublier de mettre un test d'arrêt ; celui-ci évite que la fonction s'appelle elle-même éternellement. Le test d'arrêt peut se situer au début de la fonction récursive (comme ici), ou bien juste avant les appels récursifs à l'intérieur de la fonction.