Algorithmiques élémentaires & pensée computationnelle · L1 · Section 6/6
Annales corrigées
Progression
#Annales corrigées
Cette page rassemble des exercices issus de la première UE d'informatique du semestre 1, l'UE SPUF100 « Bases de l'informatique 1 » de la Licence Informatique d'Université Côte d'Azur (campus Valrose). Le cours « Outils formels pour l'informatique » est assuré par Enrico Formenti ; les feuilles de TD couvrent les ensembles et le dénombrement, les relations et les ordres, l'induction, les récurrences, la logique et les langages formels.
Source exacte. Les énoncés reproduits ici proviennent des feuilles de travaux dirigés distribuées entre 2020 et 2023 — TD 3 « Induction », TD 4 « Dénombrement », TD 5 « Récurrence » — et des transparents de cours correspondants. La sélection privilégie les exercices qui portent sur les fondements de la pensée computationnelle : prouver qu'un algorithme termine et fait ce qu'il prétend, compter les cas d'un problème avant de l'énumérer, et résoudre l'équation de récurrence qui décrit le coût d'un algorithme récursif.
| Feuille | Thème | Exercices repris ici |
|---|---|---|
| TD 3 | Induction | 1, 4, 5, 6 |
| TD 4 | Dénombrement | 3, 7, 8, 9 |
| TD 5 | Récurrence | 1, 2, 3, 6, 7 |
Les transparents de cours fournissent en complément le matériel de référence utilisé dans les corrections et dans la page complexité : la table du temps d'exécution en fonction de et le voyageur de commerce (cours 4, dénombrement), la formule de Stirling (cours 4), l'équation de partition et la recherche dichotomique ainsi que les tours de Hanoï (cours 5, suites récurrentes), l'équation caractéristique d'ordre 2 (cours 5).
Comment travailler cette page. Les corrections sont rédigées comme on attend de les lire sur une copie : hypothèses explicites, cas de base vérifiés, hérédité justifiée, conclusion énoncée. Cherchez avant d'ouvrir.
#Exercice 1 — Des pièces de monnaie à tout faire
Énoncé (TD 3, exercice 1). Nous voulons justifier l'introduction d'une nouvelle pièce de monnaie de 3 centimes d'euro. Pour cela, montrez que pour tout objet ayant un prix supérieur ou égal à 8 centimes, il est possible de le payer avec des pièces de 3 et 5 centimes uniquement.
Correction détaillée
Reformulation. Il s'agit de montrer que tout entier s'écrit avec .
Pourquoi trois cas de base. L'hérédité naturelle consiste à dire : si est payable, alors l'est, en ajoutant une pièce de 3. Mais cette hérédité ne couvre que les , puisqu'elle exige . Il faut donc amorcer trois valeurs consécutives, de façon que tout entier plus grand retombe sur l'une d'elles :
Hérédité. Soit et supposons la propriété vraie pour . Comme , l'hypothèse de récurrence s'applique : . Alors
qui est bien une combinaison de pièces de 3 et 5. Par récurrence généralisée sur , la propriété est vraie pour tout .
La leçon sur le pas d'induction. L'erreur classique est de n'amorcer qu'un seul cas de base () et de conclure pour tout : le raisonnement ne couvre alors que et laisse sans preuve. La règle générale : si l'hérédité fait appel à , il faut cas de base consécutifs. Ici , donc trois cas de base.
Vérification numérique. , , , , , , . Les valeurs à (sauf et ) ne sont effectivement pas payables : le seuil de 8 est optimal.
#Exercice 2 — Attention aux conclusions trop rapides
Énoncé (TD 3, exercice 4). Considérons l'induction généralisée suivante sur l'ensemble des points du plan 2D. Soit la propriété : « points distincts du plan 2D sont alignés ».
- Vérifiez que est vraie.
- Supposez que soit vraie et considérez points . Comme est vraie, le sous-ensemble est aligné sur une droite et, de même, le sous-ensemble est sur une droite . Comme et ont points en commun (avec ), alors .
- Peut-on donc conclure que , est vraie ?
Correction détaillée
1. est vraie : deux points distincts du plan déterminent toujours une droite, donc ils sont alignés. Le cas de base est donc correct.
2. Le pas d'induction est faux en tant qu'énoncé général. Comptons les points communs à et . La droite passe par , la droite par . Les points communs aux deux ensembles sont , c'est-à-dire points, et non comme l'affirme l'énoncé.
Cette correction d'un point change tout. Deux droites distinctes ont au plus un point commun. Donc pour conclure , il faut que , c'est-à-dire . L'implication n'est donc démontrée que pour ; elle est sans fondement pour .
3. Non, on ne peut pas conclure. L'induction exige que le cas de base soit assez « bas » pour que l'hérédité s'y accroche. Ici l'hérédité démarre à : il faudrait donc disposer de comme cas de base. Or est fausse : trois points non alignés du plan le contredisent (par exemple , , ). L'induction ne peut pas démarrer, et la conclusion tombe.
La leçon. Une induction ne vaut que par la jonction du cas de base et de l'hérédité : il ne suffit pas que chacune des deux étapes soit vraie séparément, il faut qu'elles s'enchaînent sans trou. Le symptôme à surveiller est exactement celui-ci : une hérédité prouvée sous une condition sur () et un cas de base plus petit (). C'est le même défaut que dans le sophisme « tous les chevaux ont la même couleur ».
#Exercice 3 — Correction de l'algorithme d'Euclide
Énoncé (TD 3, exercice 5). Prouver que l'algorithme du listing ci-dessous est correct, c'est-à-dire que pour chaque paire d'entiers il renvoie bien le PGCD de et . Suggestion : il convient de faire une induction généralisée sur .
1function PGCD(a, b: integer)2begin3 if (b > a) then return PGCD(b, a);4 if (b == 0) then return a;5 else return PGCD(a - b, b);6endCorrection détaillée
Ce qu'il faut prouver. La propriété : « l'appel PGCD(a,b) termine et renvoie », pour tous entiers non tous deux nuls.
Les deux faits arithmétiques. On utilise les deux identités classiques, valables pour :
La seconde exprime que l'ensemble des diviseurs communs de et est exactement celui de et : tout divisant et divise ; réciproquement tout divisant et divise . Les deux entiers ont donc le même PGCD.
Terminaison. Le point délicat est la première ligne : l'appel PGCD(b, a) conserve la somme . Une induction simple sur ne suffit donc pas, puisque la mesure ne décroît pas sur ce cas. On prend une mesure plus fine, le couple
ordonné lexicographiquement (on compare d'abord les sommes, puis l'indicateur). Vérifions que chaque appel récursif diminue strictement :
- Cas : l'appel passe à . La somme est inchangée, mais l'indicateur passe de à (car ). Donc décroît strictement, et l'appel suivant ne peut pas reprendre cette branche.
- Cas et : l'appel passe à , de somme , strictement inférieure à puisque . Donc décroît strictement.
Comme muni de l'ordre lexicographique est bien fondé (il n'existe pas de suite infinie strictement décroissante), il n'y a pas de chaîne d'appels infinie : l'algorithme termine. Le cours utilise exactement ce vocabulaire : un ordre bien fondé est un ordre sans suite infinie strictement décroissante, et c'est lui qui autorise l'induction généralisée.
Correction (validation partielle). On raisonne par induction généralisée sur .
- Cas : l'algorithme renvoie . Or : la sortie est correcte.
- Cas : l'algorithme renvoie
PGCD(b, a). Par hypothèse d'induction appliquée à , dont la mesure est strictement plus petite, cet appel renvoie . Or le PGCD est symétrique, : la sortie est correcte. - Cas et : l'algorithme renvoie
PGCD(a-b, b). Par hypothèse d'induction, cet appel renvoie , qui vaut par l'identité établie plus haut : la sortie est correcte.
Les trois cas épuisent les situations possibles (si et , le troisième cas s'applique). L'algorithme termine et renvoie le PGCD : il est correct.
Vérification. PGCD(12, 18) : donc appel de PGCD(18, 12) ; puis PGCD(6, 12) par soustraction, puis PGCD(12, 6) par échange, puis PGCD(6, 6), puis PGCD(0, 6) ; donc renvoie . Correct.
Ce qu'il faut retenir. Le cas de base n'est pas ici « » mais « », et la terminaison se prouve par une mesure bien fondée — pas seulement par « la somme diminue ». C'est le prix à payer pour le premier test qui échange les arguments.
#Exercice 4 — Les arbres binaires
Énoncé (TD 3, exercice 6). L'ensemble des arbres binaires est défini inductivement par : ; si et alors . Soient , et les fonctions donnant respectivement la hauteur, le nombre de nœuds et le nombre de feuilles d'un arbre binaire.
- Définir inductivement chacune des fonctions , et .
- Montrer que pour tout arbre binaire , et .
- Montrer que l'ensemble des arbres binaires est inductif.
Correction détaillée
1. Définitions inductives. La structure de l'ensemble impose la forme des définitions : une clause pour la base (), une clause pour l'étape inductive (le nœud ).
La hauteur du nœud racine ajoute 1 au maximum des hauteurs des sous-arbres ; le nombre de nœuds ajoute 1 aux effectifs des deux sous-arbres ; le nombre de feuilles se transmet par les sous-arbres non vides, une feuille étant un nœud dont les deux sous-arbres sont vides.
2. Bornes. On raisonne par induction structurelle, c'est-à-dire par le principe d'induction sur l'ensemble défini inductivement : la propriété est vérifiée sur la base, puis on montre que si elle est vraie de et de , elle est vraie de .
Borne sur les nœuds. Pour : et , donc l'égalité tient. Pour : par hypothèse d'induction, et , d'où
Or et par définition de , donc et . Il vient
Borne sur les feuilles. Pour : et la borne s'écrit , ce qui n'a pas de sens : on énonce donc la propriété pour , ce qui impose . Pour une feuille : et : l'égalité tient. Pour non feuille, les deux sous-arbres sont non vides, donc et , et l'hypothèse d'induction s'applique :
3. est inductif. est défini inductivement par une base () et un ensemble fini d'opérations (, d'arité 2). Le cours énonce qu'un ensemble défini inductivement est inductif, c'est-à-dire qu'il est muni d'un bon ordre permettant d'y appliquer le principe d'induction structurelle. C'est précisément ce principe qui vient d'être utilisé en 2.
Vérification. Pour l'arbre parfait de hauteur 3 (racine, 2 enfants, 4 petits-enfants), : la borne sur les nœuds est atteinte. Ses feuilles sont au nombre de : la borne sur les feuilles est atteinte aussi. Les deux inégalités sont donc optimales, et l'arbre parfait est l'unique cas d'égalité.
Lien avec la complexité. La borne se réécrit : la hauteur d'un arbre à nœuds ne peut pas descendre sous . C'est cette inégalité qui rend crédible la promesse d'une recherche en dans un arbre binaire de recherche équilibré — et qui explique que cette promesse tombe si l'arbre dégénère en liste, cas où .
#Exercice 5 — Compter les opérations d'un programme
Énoncé (TD 4, exercice 3). Quelle est la valeur de la variable compteur à la sortie du sous-programme ci-dessous ?
1compteur ← 02pour i de 1 à n faire3 pour j de 1 à n faire4 pour k de 1 à n faire5 compteur ← compteur + 1Correction détaillée
Chaque boucle parcourt exactement valeurs. Les trois boucles étant imbriquées, leurs nombres d'itérations se multiplient : le corps de la boucle la plus interne est exécuté
fois. À la sortie, compteur vaut donc .
Le réflexe de comptage. Boucles successives (l'une après l'autre) : les coûts s'additionnent. Boucles imbriquées : les coûts se multiplient. C'est la règle qui transforme un programme en formule, et elle est la base de toute analyse de complexité avant même d'introduire la notation grand-O.
Vérification. Pour , les triplets parcourus sont : . Pour , . Le décompte est bien cubique.
Ordre de grandeur. En comptant une opération par tour, ce programme coûte opérations. Doubler multiplie le travail par : c'est la signature d'un algorithme cubique, à éviter dès que dépasse quelques milliers.
#Exercice 6 — Chemins monotones dans une grille
Énoncé (TD 4, exercice 7). Un réseau informatique est structuré en grille. Des paquets de données doivent aller du point au point en suivant les mailles, avec la contrainte supplémentaire que les paquets vont toujours de la gauche vers la droite et du bas vers le haut. Combien d'itinéraires différents peuvent-ils suivre, sachant que la grille comprend mailles en largeur et mailles en hauteur ?
Correction détaillée
Traduire un chemin en mot. Un itinéraire monotone de vers est entièrement décrit par la suite de ses déplacements élémentaires : un pas vers la droite (notons-le ) ou un pas vers le haut (notons-le ). Parcourir la grille de mailles en largeur et mailles en hauteur exige exactement
soit pas au total. Réciproquement, tout mot de lettres sur l'alphabet comportant occurrences de et occurrences de décrit un et un seul itinéraire monotone. Il y a donc bijection entre les itinéraires et ces mots.
Compter les mots. Choisir un tel mot, c'est choisir les positions occupées par les parmi les positions disponibles : les occupent automatiquement les autres. Le nombre cherché est donc le coefficient binomial
Vérification. Pour (une maille en largeur, une en hauteur), la formule donne , et l'on voit bien les deux chemins : et . Pour : , soit , , . Le résultat est cohérent.
Pourquoi c'est un résultat de combinatoire, pas d'énumération. Le nombre de chemins croît de façon exponentielle avec : pour il vaut déjà , et il dépasse le milliard dès . L'énumération exhaustive coûterait précisément ce nombre d'opérations. Compter au lieu d'énumérer est exactement le geste que le cours met en avant : « avant d'énumérer, il est prudent de dénombrer ».
#Exercice 7 — Dénombrer les graphes non orientés
Énoncé (TD 4, exercice 8). Un graphe non orienté est caractérisé par son ensemble de sommets et son ensemble d'arêtes (non orientées) . Soit un ensemble de sommets.
- Dessinez les trois graphes non orientés , et ayant respectivement , et comme ensemble de sommets et dont le nombre d'arêtes est maximal.
- Calculez le nombre maximal d'arêtes d'un graphe non orienté ayant comme ensemble de sommets.
- Déduisez-en le nombre de graphes non orientés sur l'ensemble de sommets .
- Application numérique : quel est le nombre de graphes non orientés sur l'ensemble de sommets ?
Correction détaillée
1. Graphes maximaux. est un sommet isolé (aucune arête, ). est un segment : une arête reliant et (). est un triangle : les trois arêtes , , (). Ce sont les graphes complets sur , et sommets.
2. Nombre maximal d'arêtes. Une arête non orientée est une paire de sommets distincts, donc une partie à 2 éléments de . Le nombre maximal d'arêtes est le nombre de ces paires :
Justification : il y a choix pour le premier sommet et pour le second, soit couples ordonnés ; chaque arête non orientée est comptée deux fois, une fois comme et une fois comme . D'où . Aucun graphe simple ne peut faire mieux, puisqu'il ne peut contenir que des paires distinctes de .
3. Nombre de graphes. Un graphe non orienté sur est déterminé par la donnée de son ensemble d'arêtes, c'est-à-dire par le choix d'une partie de l'ensemble des paires possibles. Il y a donc autant de graphes que de parties de cet ensemble, soit
4. Application numérique. et . Les huit graphes sur correspondent aux huit parties de l'ensemble des trois arêtes possibles : le graphe vide, les trois graphes à une arête, les trois graphes à deux arêtes, et le triangle.
Ce que ce résultat enseigne. Le nombre de graphes sur sommets est : pour cela fait déjà , et pour , environ . Aucun algorithme ne peut énumérer tous les graphes au-delà de quelques dizaines de sommets : c'est exactement le mur exponentiel que décrit le cours de dénombrement, et la raison pour laquelle on cherche des propriétés à prouver plutôt que des cas à parcourir.
#Exercice 8 — Ouvrir un coffre
Énoncé (TD 4, exercice 9). Mme Joublietout a un coffre-fort qui s'ouvre en rentrant une clef à 4 chiffres. Elle a oublié la combinaison mais se rappelle que la somme des quatre chiffres est 10 et qu'aucun des quatre chiffres n'est 0. Combien de combinaisons doit-elle essayer au total ? Combien d'essais si les chiffres peuvent être 0 ?
Correction détaillée
Notons les quatre chiffres de la combinaison. L'énoncé se traduit en un système de contraintes arithmétiques :
Le cours fournit exactement l'outil adapté : le nombre de solutions entières de avec est le nombre de combinaisons avec répétition de éléments pris parmi , soit
Cas 1 — aucun chiffre nul. On se ramène au cas positif ou nul par le changement de variable , qui est légitime car . En substituant dans l'équation,
Il reste 4 variables pour un total de 6, donc
Cas 2 — les chiffres peuvent être nuls. On applique la formule directement, avec et :
Réponse. Mme Joublietout doit essayer 84 combinaisons dans le premier cas et 286 dans le second.
Le point à ne pas manquer. Le changement de variable porte sur chaque variable : retirer 1 à chacune retire 4 au total, et c'est le second membre qui doit absorber ce retrait (). Oublier de retirer 4 donne le même dans les deux cas — un signe infaillible que l'erreur a été commise, puisque les deux questions n'ont aucune raison d'avoir la même réponse.
Vérification. Dans le cas 1, les quadruplets ordonnés d'entiers de somme 10 se répartissent en familles : et ses permutations, et ses permutations, etc. Le total de 84 est de l'ordre de grandeur attendu, et il est bien inférieur au total du cas 2, comme il se doit puisqu'on y impose une contrainte de plus.
#Exercice 9 — Une récurrence complète
Énoncé (TD 5, exercice 1). Résoudre la récurrence suivante, sachant que :
Correction détaillée
Pourquoi on parle de récurrence complète. Le terme dépend de tous les termes précédents, pas d'un nombre fixé d'entre eux : le cours appelle cela une relation de récurrence complète. La technique associée est la réduction d'ordre par différence : on écrit la relation au rang et on retranche celle du rang , ce qui élimine la somme.
Étape 1 — écrire la relation au rang suivant.
Étape 2 — isoler la somme. En séparant le dernier terme de la somme :
Or la relation au rang donne . En substituant :
Étape 3 — résoudre la récurrence d'ordre 1 obtenue. Pour tout , , donc la suite est géométrique de raison 4 à partir de :
Il reste à calculer par la relation d'origine : . D'où
et cette formule vaut aussi pour puisque . Donc
Vérification. . . . . La formule est confirmée sur quatre rangs.
La méthode en une phrase. Pour une récurrence complète, on écrit la relation au rang , on y reconnaît l'expression du rang et on soustrait : la somme disparaît et il ne reste qu'une récurrence d'ordre 1, que l'on sait résoudre.
#Exercice 10 — Récurrences non homogènes et homogène d'ordre 2
Énoncé (TD 5, exercices 2 et 3). Résoudre les récurrences suivantes, sachant que dans les deux premiers cas :
- .
- .
- , avec et .
Correction détaillée
1. Suite arithmétique déguisée (, ). On déroule la récurrence en sommant les équations, technique du cours :
En additionnant membre à membre, les termes intermédiaires s'annulent et il reste
Donc . Vérification : , et la formule donne ; , et la formule donne . Correct.
2. Suite géométrique translatée (, constants). On divise par la puissance qui rend la relation homogène. Posons : alors
et . Donc est géométrique de raison 2 : , d'où
Vérification : et ; et . C'est aussi le coût des tours de Hanoï, que le cours résout exactement de cette façon : , donne .
3. Récurrence homogène d'ordre 2 à coefficients constants. On applique la technique de l'équation caractéristique. On cherche des solutions de la forme : en substituant dans ,
Le discriminant vaut , d'où deux racines réelles distinctes
Le cours donne alors la solution générale , soit . Les conditions initiales fixent et :
Par différence : , donc et . D'où
Vérification : , , et , et . Correct.
Les trois cas à reconnaître. Le cours classe les récurrences linéaires d'ordre 1 selon et : avec constant donne une suite arithmétique (cas 1, avec dépendant de ) ; constant donne une suite géométrique, éventuellement translatée (cas 2). Pour l'ordre 2 homogène à coefficients constants, l'équation caractéristique remplace tout : deux racines réelles distinctes donnent , une racine double donne .
#Exercice 11 — Complexité du tri rapide au pire cas
Énoncé (TD 5, exercice 6). La complexité dans le pire des cas de l'algorithme du tri rapide pour trier une liste de nombres vérifie l'équation de récurrence ci-dessous (on a un peu triché ici pour simplifier l'expression). Résolvez-la, c'est-à-dire exprimez le terme général de la suite en fonction de uniquement.
Correction détaillée
Méthode de sommation. On écrit la relation aux rangs successifs et on additionne, exactement comme pour une récurrence d'ordre 1 avec :
En additionnant membre à membre, les termes s'annulent deux à deux et il reste
Évaluation de la somme. La somme des entiers de 4 à vaut
D'où
Vérification. : la condition initiale est respectée. et la formule donne . et . et . La formule est confirmée.
Interprétation. est un polynôme de degré 2 : le tri rapide est quadratique dans le pire cas, ce que l'on écrit . Le cas se produit lorsque le pivot est systématiquement le plus petit ou le plus grand élément, si bien que la partition ne retire qu'un seul élément à chaque tour : la profondeur de récursion devient au lieu de . C'est pourquoi les implémentations sérieuses choisissent le pivot au hasard ou en médiane de trois.
Vérification sur le listing du TD. Le pseudo-code de la feuille appelle trirapide(d, pivot-1) puis trirapide(pivot+1, d). La seconde borne devrait être f (la borne droite de la partition) : telle qu'elle est écrite, la récursion de droite repart sur l'intervalle initial. Le listing comporte donc une coquille ; la borne correcte est trirapide(pivot+1, f).
#Exercice 12 — Compter les tas de sable
Énoncé (TD 5, exercice 7). Un tas de sable est une séquence ordonnée d'entiers naturels non nuls, strictement décroissante ; chaque entier représente le nombre de grains empilés à cette position.
- On veut compter le nombre de tas de sable distincts que l'on peut former sachant que le premier élément de la séquence vaut . Pour , on peut former , , , , donc . Calculez .
- Trouvez l'expression de en fonction de seulement, sachant que .
Correction détaillée
1. Calcul de . Énumérons les tas commençant par 4, en classant selon le deuxième élément.
- Tas réduit à : 1 possibilité.
- Deuxième élément 3 : la suite des éléments suivants est un tas commençant par 3, soit tout court, ou suivi d'un tas commençant par 1 ou 2. Cela donne , , , : 4 possibilités, soit .
- Deuxième élément 2 : et : 2 possibilités, soit .
- Deuxième élément 1 : : 1 possibilité, soit .
Au total .
2. Relation de récurrence. Généralisons l'observation précédente. Un tas commençant par est :
- soit la séquence réduite : 1 possibilité ;
- soit suivi d'un tas commençant par un élément avec : possibilités pour chaque .
D'où, pour ,
la dernière égalité utilisant , que le premier cas réalise précisément. Vérification : (seul le tas ) ; (les tas et ) ; , conforme à l'énoncé.
3. Résolution. La relation est une récurrence complète, du même type que l'exercice 9. On l'écrit au rang et on soustrait :
La suite est donc géométrique de raison 2 à partir de :
Vérification : , , , . Conforme.
Ce que le résultat dit. Les tas de sable à premier élément sont en bijection avec les parties de : un tas est déterminé par le choix de l'ensemble des positions occupées, ce qui explique le et fait écho au comptage des parties d'un ensemble à éléments. Le comptage combinatoire et la récurrence disent ici la même chose.
#Ce que ces annales vérifient
- Induction : cas de base multiples quand l'hérédité recule de (exercice 1) ; jonction obligatoire entre cas de base et hérédité (exercice 2) ; mesure bien fondée pour la terminaison (exercice 3) ; induction structurelle sur un ensemble défini inductivement (exercice 4).
- Dénombrement : boucles imbriquées et multiplication des coûts (exercice 5) ; bijection entre chemins et mots, coefficients binomiaux (exercice 6) ; nombre de graphes (exercice 7) ; combinaisons avec répétition et changement de variable (exercice 8).
- Récurrences : récurrence complète réduite par différence (exercices 9, 12) ; suites arithmétiques, géométriques et translatées (exercice 10) ; équation caractéristique d'ordre 2 (exercice 10) ; récurrence de coût d'un algorithme récursif (exercice 11).