
CHAPITRE
1Décomposition d’un pro-
gramme C – récursivité
1.1 Approche descendante
On se replace ici sur le problème de conception algorithmique d’un programme qui doit réaliser une
tâche complexe. Pour trouver une solution algorithmique à ce problème, l’approche descendante
invite à décomposer cette tâche, qu’on va dire de premier niveau, en tâches de second niveau. Cette
première étape permet d’avoir un algorithme abstrait (dans le sens où il ne peut être exécuté par la
machine). Dans un second temps, l’analyste programmeur s’intéresse aux tâches de second niveau
pour en donner des algorithmes utilisant des tâches de troisième niveau etc. jusqu’à décrire les tâches
à partir d’instructions élémentaires.
La devise de l’approche descendante est “diviser pour régner” : le problème est divisé est sous-partie
qu’on sait bien faire (régner), et qu’on sait combiner en utilisant les structures de contrôle usuelles.
L’approche descendante est une démarche intellectuelle pour aider à construire des algorithmes. Il
est intéressant de conserver des traces de cette démarche conservant une trace des tâches de second
niveau, troisième niveau ...
– ceci va rendre le programme beaucoup plus lisible que si il était entièrement écris dans une unique
fonction main(), et donc ce sera beaucoup plus facile d’y trouver des erreurs ou, pour autre pro-
grammeur, de comprendre ce programme.
– les briques intermédiaires sont réutilisables pour d’autres programmes. Si ces briques sont bien
conçues, elles sont suffisamment génériques pour pouvoir être utilisées à plusieurs endroits dans
vos programmes. Plutôt que de refaire à chaque fois le même bout de programme, mieux vaut le
faire une fois bien, et le réutiliser ensuite1!
– le travail est plus facilement partageable entre plusieurs programmeurs. Si deux programmeurs se
sont bien mis d’accord sur les spécifications des fonctions, peut importe lequel des programmeurs
a effectivement réalisé la fonction, ils pourront utiliser le travail de l’autre sans se soucier de com-
ment c’est fait.
En programmation, les sous-tâches peuvent s’écrire sous la forme de fonctions. Chaque fonction réa-
lise une sous-tâche. Les fichiers .h et .c permettent ensuite de regrouper des ensembles de fonctions
qui sont cohérentes entre elles de sorte à constituer des sortes de modules (on parle de programma-
tion modulaire).
Un programme sera désormais composé comme un ensemble de fonctions 2qui peuvent s’appeler
les unes les autres. La fonction main() est une fonction particulière, puisque le compilateur va savoir
que c’est par cette fonction que le programme doit commencer ! Pour le main(), on parle parfois de
programme principal. Il serait plus judicieux de parler de fonction principale.
1. Il semble ici opportun de rappeler que les fainéants ont bonne presse chez les informaticiens. En effet, mieux vaut
utiliser quelque chose qui est déjà fait et qui marche que de le refaire moins bien soit même!
2. En programmation, on distingue parfois les fonctions, des procédures. En C, tout est fonction. Je n’insisterai pas sur
la différence.
3