Aller au contenu

Mathématiques (spécialité) · TerminaleBac

Algorithmes de seuil et de dichotomie : exercices de Terminale

Publié le 7 novembre 2026 · Mis à jour le 7 novembre 2026 · Signaler une erreur

L'essentiel

  • Un algorithme de seuil répète un calcul dans une boucle while jusqu'à ce qu'une condition soit atteinte, et renvoie le rang n correspondant.
  • La dichotomie coupe l'intervalle de recherche en deux à chaque étape et garde la moitié qui contient la solution.
  • Pour une fonction continue qui change de signe sur [a ; b], on garde la moitié où le signe change ; l'amplitude est divisée par 2 à chaque tour.
  • Avant de programmer, fais toujours tourner l'algorithme à la main sur un petit exemple : un tableau de valeurs révèle la plupart des erreurs de condition.

Comment utiliser ces exercices

Ces exercices te font manipuler deux familles d'algorithmes très présentes en Terminale : le seuil (on cherche à partir de quel rang une suite dépasse une valeur) et la dichotomie (on resserre un encadrement en le coupant en deux). Le programme de spécialité rappelle que l'algorithmique concerne toutes les parties du cours et fait intervenir variables, affectation, instruction conditionnelle, boucle, fonction et liste 1. Tu retrouveras tous ces ingrédients ici.

Cherche d'abord seul, sur papier. Si tu bloques, ouvre un indice, puis recommence. Ne lis la correction qu'après avoir écrit une réponse, même fausse : comparer sa propre démarche à celle de la correction fait bien plus progresser que la lecture seule. Les exercices sont rangés par difficulté croissante.

Les exercices

Exercice 1 Premier seuil : une suite qui double

★☆☆Environ 8 min

On définit la suite (un)(u_n) par u0=1u_0 = 1 et un+1=2unu_{n+1} = 2u_n pour tout entier nn.

On considère la fonction Python suivante :

def seuil():
    n = 0
    u = 1
    while u <= 1000:
        u = 2 * u
        n = n + 1
    return n
  1. Que vaut unu_n en fonction de nn ?
  2. Quelle valeur renvoie seuil() ?
Indice 1

Reconnais une suite géométrique et écris son terme général.

Indice 2

Cherche la plus petite puissance de 2 strictement supérieure à 1000 ; tu peux t'aider de 2102^{10}.

Voir la correction pas à pas
  1. La suite est géométrique de raison 2 et de premier terme 1, donc un=2nu_n = 2^n.

  2. La boucle tourne tant que u≤1000u \leq 1000 et s'arrête dès que u>1000u > 1000 : la fonction renvoie le plus petit rang nn tel que 2n>10002^n > 1000.

  3. On calcule : 29=5122^9 = 512, qui est inférieur à 1000, puis 210=10242^{10} = 1024, qui est supérieur à 1000.

  4. La fonction renvoie donc n=10n = 10.

La sortie de la boucle correspond au premier rang où un>1000u_n > 1000, c'est-à-dire le premier rang où la condition du while devient fausse. Comme la suite est croissante, elle reste ensuite au-dessus de 1000.

Exercice 2 Seuil avec une évolution de 5 % par an

★☆☆Environ 10 min

Un capital de 1 000 euros est placé à intérêts composés au taux de 5 % par an. On note CnC_n le capital après nn années, donc C0=1000C_0 = 1000 et Cn+1=1,05 CnC_{n+1} = 1{,}05\,C_n.

  1. Écris une boucle while qui détermine le nombre d'années nécessaires pour que le capital atteigne au moins 2 000 euros.
  2. Quelle est la valeur trouvée ?
Indice 1

La boucle continue tant que le capital est strictement inférieur à 2 000.

Indice 2

Utilise la forme Cn=1000×1,05nC_n = 1000 \times 1{,}05^n pour vérifier ton résultat à la calculatrice.

Voir la correction pas à pas
  1. On initialise n = 0 et C = 1000.

  2. La condition de continuation est C < 2000 : on veut s'arrêter quand C >= 2000.

  3. Dans la boucle, on écrit C = 1.05 * C puis n = n + 1.

  4. On vérifie avec la forme explicite : 1,0514≈1,9801{,}05^{14} \approx 1{,}980, donc 1 980 euros environ, encore sous 2 000 ; 1,0515≈2,0791{,}05^{15} \approx 2{,}079, donc environ 2 079 euros, au-dessus.

  5. Le capital atteint au moins 2 000 euros au bout de n=15n = 15 années.

Ici l'énoncé dit « au moins », donc la condition d'arrêt est C >= 2000 et la boucle tourne tant que C < 2000. Attention au signe strict ou large : il décide du rang obtenu quand le seuil tombe pile.

Exercice 3 Suivre l'algorithme à la main

★☆☆Environ 10 min

Soit (un)(u_n) définie par u0=3u_0 = 3 et un+1=2un−1u_{n+1} = 2u_n - 1.

n = 0
u = 3
while u <= 100:
    u = 2 * u - 1
    n = n + 1

Dresse le tableau des valeurs de n et u à chaque tour, puis donne la valeur de n à la fin de l'exécution.

Indice 1

Recopie un tableau à deux colonnes n et u et remplis-le ligne par ligne.

Indice 2

Arrête-toi à la première valeur de u strictement supérieure à 100.

Voir la correction pas à pas
  1. Au départ : n=0n = 0, u=3u = 3. On a 3≤1003 \leq 100, la boucle commence.

  2. Tour 1 : u=2×3−1=5u = 2 \times 3 - 1 = 5, n=1n = 1.

  3. Tour 2 : u=9u = 9, n=2n = 2. Tour 3 : u=17u = 17, n=3n = 3. Tour 4 : u=33u = 33, n=4n = 4. Tour 5 : u=65u = 65, n=5n = 5.

  4. Tour 6 : u=2×65−1=129u = 2 \times 65 - 1 = 129, n=6n = 6. Comme 129>100129 > 100, la condition du while est fausse et la boucle s'arrête.

  5. À la fin, n=6n = 6 et u=129u = 129. On peut le confirmer : un=2n+1+1u_n = 2^{n+1} + 1, et u6=27+1=129u_6 = 2^7 + 1 = 129.

Le tableau de suivi est l'outil le plus fiable pour comprendre un algorithme. Retiens aussi que la valeur de uu en sortie est la première au-dessus du seuil, pas la dernière en dessous.

Exercice 4 Écrire une fonction de seuil

★★☆Environ 15 min

Soit (un)(u_n) définie par u0=5u_0 = 5 et un+1=3un+2u_{n+1} = 3u_n + 2.

  1. Écris en Python une fonction seuil(S) qui renvoie le plus petit entier nn tel que un>Su_n > S.
  2. Montre que un+1u_n + 1 est géométrique, puis déduis-en unu_n en fonction de nn.
  3. Quelle valeur renvoie seuil(1000) ?
Indice 1

Pose vn=un+1v_n = u_n + 1 et calcule vn+1v_{n+1} en fonction de vnv_n.

Indice 2

Après avoir trouvé la forme explicite, résous 6×3n−1>10006 \times 3^n - 1 > 1000 en testant des puissances de 3.

Voir la correction pas à pas
  1. Fonction : on initialise n = 0 et u = 5, on boucle tant que u <= S, on remplace u par 3 * u + 2, on augmente n, puis on renvoie n.

    def seuil(S):
        n = 0
        u = 5
        while u <= S:
            u = 3 * u + 2
            n = n + 1
        return n
    
  2. On pose vn=un+1v_n = u_n + 1. Alors vn+1=un+1+1=3un+3=3(un+1)=3vnv_{n+1} = u_{n+1} + 1 = 3u_n + 3 = 3(u_n + 1) = 3v_n. La suite (vn)(v_n) est géométrique de raison 3 et de premier terme v0=6v_0 = 6.

  3. On en déduit vn=6×3nv_n = 6 \times 3^n, donc un=6×3n−1u_n = 6 \times 3^n - 1.

  4. On cherche 6×3n−1>10006 \times 3^n - 1 > 1000, soit 3n>10016≈166,83^n > \dfrac{1001}{6} \approx 166{,}8.

  5. Or 34=813^4 = 81 ne convient pas et 35=2433^5 = 243 convient : seuil(1000) renvoie 55. Contrôle : u5=6×243−1=1457>1000u_5 = 6 \times 243 - 1 = 1457 > 1000 et u4=6×81−1=485≤1000u_4 = 6 \times 81 - 1 = 485 \leq 1000.

Le programme donne la réponse sans calcul explicite, mais la forme explicite permet de la vérifier et de prévoir le rang sans exécuter la boucle. Les deux démarches se complètent.

Exercice 5 Un seuil vers le bas

★★☆Environ 12 min

Une substance perd 20 % de sa quantité chaque heure. On note qnq_n la quantité (en grammes) après nn heures, avec q0=100q_0 = 100.

  1. Exprime qn+1q_{n+1} en fonction de qnq_n.
  2. À partir de combien d'heures la quantité devient-elle strictement inférieure à 10 grammes ?
  3. Que faut-il changer dans la condition du while par rapport à un seuil vers le haut ?
Indice 1

Perdre 20 % revient à multiplier par 0,80{,}8.

Indice 2

Ici la boucle doit continuer tant que la quantité est supérieure ou égale à 10.

Voir la correction pas à pas
  1. Une baisse de 20 % multiplie par 1−0,2=0,81 - 0{,}2 = 0{,}8, donc qn+1=0,8 qnq_{n+1} = 0{,}8\,q_n et qn=100×0,8nq_n = 100 \times 0{,}8^n.

  2. On veut 100×0,8n<10100 \times 0{,}8^n < 10, c'est-à-dire 0,8n<0,10{,}8^n < 0{,}1.

  3. On teste : 0,810≈0,10740{,}8^{10} \approx 0{,}1074, qui est encore supérieur à 0,10{,}1 ; 0,811≈0,08590{,}8^{11} \approx 0{,}0859, qui est inférieur à 0,10{,}1.

  4. La quantité passe donc sous 10 grammes au bout de n=11n = 11 heures.

  5. Dans le programme, on écrit while q >= 10: avec q = 0.8 * q. Le sens de l'inégalité s'inverse par rapport à un seuil vers le haut, parce que la suite est décroissante.

Pour une suite décroissante, on cherche le premier rang sous le seuil. La condition du while est toujours le contraire de l'objectif, quel que soit le sens de variation.

Exercice 6 Trois étapes de dichotomie à la main

★★☆Environ 15 min

Soit f(x)=x2−2f(x) = x^2 - 2 sur l'intervalle [1 ; 2][1\,;\,2].

  1. Justifie que l'équation f(x)=0f(x) = 0 admet une solution dans [1 ; 2][1\,;\,2].
  2. Applique trois étapes de dichotomie. Donne l'intervalle obtenu et, en particulier, la valeur de la borne gauche aa après la troisième étape.
Indice 1

Calcule f(1)f(1) et f(2)f(2) et rappelle-toi que ff est continue et croissante sur [1 ; 2][1\,;\,2].

Indice 2

À chaque étape, calcule le milieu mm, puis le signe de f(m)f(m) : f(1)<0f(1) < 0, donc si f(m)<0f(m) < 0 la solution est à droite de mm.

Voir la correction pas à pas
  1. f(1)=−1<0f(1) = -1 < 0 et f(2)=2>0f(2) = 2 > 0. La fonction ff est continue et strictement croissante sur [1 ; 2][1\,;\,2] : elle s'annule une seule fois sur cet intervalle.

  2. Étape 1 : m=1,5m = 1{,}5 et f(1,5)=2,25−2=0,25>0f(1{,}5) = 2{,}25 - 2 = 0{,}25 > 0. Le signe change entre a=1a=1 et mm, donc on garde [1 ; 1,5][1\,;\,1{,}5].

  3. Étape 2 : m=1,25m = 1{,}25 et f(1,25)=1,5625−2=−0,4375<0f(1{,}25) = 1{,}5625 - 2 = -0{,}4375 < 0. Le signe change entre mm et b=1,5b = 1{,}5, donc on garde [1,25 ; 1,5][1{,}25\,;\,1{,}5].

  4. Étape 3 : m=1,375m = 1{,}375 et f(1,375)=1,890625−2≈−0,109<0f(1{,}375) = 1{,}890625 - 2 \approx -0{,}109 < 0. On garde [1,375 ; 1,5][1{,}375\,;\,1{,}5].

  5. Après trois étapes, la borne gauche vaut a=1,375a = 1{,}375 et l'amplitude est 0,125=1230{,}125 = \dfrac{1}{2^3}.

À chaque étape l'amplitude est divisée par 2 : on l'obtient directement par b0−a02k\dfrac{b_0 - a_0}{2^k} après kk étapes. La solution cherchée, 2≈1,414\sqrt{2} \approx 1{,}414, est bien dans l'intervalle trouvé.

Exercice 7 Combien d'étapes pour une précision donnée ?

★★☆Environ 12 min

On applique la dichotomie à une fonction continue sur un intervalle initial de longueur 1.

  1. Quelle est la longueur de l'intervalle après kk étapes ?
  2. Combien d'étapes faut-il au minimum pour obtenir un encadrement d'amplitude strictement inférieure à 0,010{,}01 ?
  3. Écris la boucle correspondante, avec un compteur de tours.
Indice 1

L'amplitude est divisée par 2 à chaque tour.

Indice 2

Cherche le plus petit kk tel que 2k>1002^k > 100.

Voir la correction pas à pas
  1. Chaque étape coupe l'intervalle en deux et garde une moitié, donc la longueur après kk étapes est 12k\dfrac{1}{2^k}.

  2. On veut 12k<0,01\dfrac{1}{2^k} < 0{,}01, soit 2k>1002^k > 100.

  3. On teste : 26=642^6 = 64 est trop petit, 27=1282^7 = 128 convient.

  4. Il faut donc au minimum k=7k = 7 étapes. Contrôle : 164≈0,0156\dfrac{1}{64} \approx 0{,}0156 n'est pas assez petit, et 1128≈0,0078\dfrac{1}{128} \approx 0{,}0078 l'est.

  5. Boucle : while b - a >= 0.01: on calcule m = (a + b) / 2, on met à jour a ou b selon le signe, et on fait k = k + 1 à chaque tour.

Le nombre d'étapes dépend de la précision voulue et de la longueur de départ, pas de la fonction étudiée. C'est ce qui rend la dichotomie sûre : on sait à l'avance combien de tours au plus auront lieu.

Exercice 8 Recherche dichotomique dans une liste triée

★★★Environ 15 min

On considère la liste triée par ordre croissant :

L = [2, 5, 8, 12, 16, 23, 38, 56, 72, 91]

On cherche la valeur 23 par dichotomie avec les indices a = 0 et b = 9. À chaque tour, on calcule m = (a + b) // 2 puis on compare L[m] à la valeur cherchée : si L[m] est plus petit, a devient m + 1 ; s'il est plus grand, b devient m - 1 ; s'il est égal, on a trouvé.

  1. Déroule l'algorithme et donne les valeurs successives de m.
  2. Quel indice est renvoyé ?
Indice 1

La division // donne la partie entière du quotient : 9 // 2 vaut 4.

Indice 2

Si L[m] est plus petit que 23, tout ce qui est à gauche de m est écarté aussi.

Voir la correction pas à pas
  1. Tour 1 : a = 0, b = 9, m = 9 // 2 = 4. On lit L[4] = 16, qui est inférieur à 23 : on pose a = 5.

  2. Tour 2 : a = 5, b = 9, m = 14 // 2 = 7. On lit L[7] = 56, qui est supérieur à 23 : on pose b = 6.

  3. Tour 3 : a = 5, b = 6, m = 11 // 2 = 5. On lit L[5] = 23 : la valeur est trouvée.

  4. L'algorithme renvoie l'indice 5, après seulement 3 comparaisons.

  5. Dans le pire cas pour dix éléments, la zone de recherche reste coupée en deux à chaque tour, donc le nombre de comparaisons reste très petit devant la taille de la liste. Un balayage séquentiel de la liste aurait demandé 6 lectures pour atteindre la valeur 23.

Cette méthode ne fonctionne que si la liste est triée. Sur une liste désordonnée, éliminer une moitié n'aurait aucun sens, puisqu'on ne saurait pas dans quelle moitié se trouve la valeur.

Exercice 9 Trouver et corriger l'erreur

★★★Environ 15 min

Un élève veut encadrer la solution de f(x)=0f(x)=0 pour f(x)=x3+x−1f(x) = x^3 + x - 1 sur [0 ; 1][0\,;\,1] avec une précision de 10−310^{-3}.

def f(x):
    return x**3 + x - 1

def dicho():
    a, b = 0, 1
    while b - a > 0.001:
        m = (a + b) / 2
        if f(m) > 0:
            a = m
        else:
            b = m
    return a, b
  1. Calcule f(0)f(0) et f(1)f(1).
  2. Explique pourquoi ce programme est faux et ce qu'il renvoie.
  3. Propose une version corrigée.
Indice 1

Détermine le signe de f(0)f(0) et celui de f(1)f(1) : la solution est du côté où ff change de signe.

Indice 2

Si f(m)>0f(m) > 0, la solution se trouve entre aa et mm, pas entre mm et bb.

Voir la correction pas à pas
  1. On calcule f(0)=−1<0f(0) = -1 < 0 et f(1)=1>0f(1) = 1 > 0. La fonction est croissante et change de signe sur [0 ; 1][0\,;\,1] : il faut garder à chaque tour la moitié aux bornes de laquelle ff prend des signes contraires.

  2. Si f(m)>0f(m) > 0, alors mm est déjà à droite de la solution, car ff est croissante et positive à partir de la solution. Il faut garder [a ; m][a\,;\,m] et poser b = m. Le programme fait l'inverse et pose a = m.

  3. Conséquence : le programme garde la moitié qui ne contient pas la solution. Par exemple, au premier tour m=0,5m = 0{,}5 et f(0,5)=−0,375<0f(0{,}5) = -0{,}375 < 0, donc le programme pose b = 0.5 alors que la solution est à droite de 0,50{,}5. L'intervalle final ne contient pas la solution.

  4. Version corrigée : inverser les deux affectations.

    while b - a > 0.001:
        m = (a + b) / 2
        if f(m) > 0:
            b = m
        else:
            a = m
    
  5. Après correction, l'invariant est : f(a)≤0≤f(b)f(a) \leq 0 \leq f(b) à chaque tour. Le programme s'arrête quand l'amplitude descend sous 0,0010{,}001, soit après 10 étapes puisque 1210≈0,00098\dfrac{1}{2^{10}} \approx 0{,}00098.

Pour éviter ce piège, choisis un invariant (ici, f(a)f(a) et f(b)f(b) de signes contraires) et vérifie que chaque branche du if le préserve. Teste aussi ton programme sur un cas dont tu connais la réponse.

Les questions qu'on se pose

Comment choisir entre `while u < S` et `while u <= S` dans un algorithme de seuil ?

Écris d'abord l'objectif avec les mots de l'énoncé, puis prends son contraire. Pour « unu_n strictement supérieur à SS », la boucle continue tant que u <= S. Pour « unu_n supérieur ou égal à SS », elle continue tant que u < S. Teste ensuite sur un cas où le seuil est atteint pile : c'est là que la différence apparaît.

Pourquoi la dichotomie est-elle plus rapide qu'un balayage de la liste ?

Parce qu'à chaque tour, on écarte une moitié de la zone de recherche d'un coup, alors qu'un balayage ne peut écarter qu'un élément à la fois. Cette méthode suppose les données ordonnées 2, ce qui permet de savoir de quel côté du milieu se trouve la valeur cherchée.

Que faire quand mon `while` ne s'arrête jamais ?

Vérifie trois points : la variable testée dans la condition est bien modifiée dans la boucle, elle évolue dans le bon sens vers le seuil (une suite décroissante ne dépassera jamais un seuil vers le haut), et n est bien incrémenté. Une boucle while est non bornée : c'est à toi de t'assurer que la condition deviendra fausse 2. En cas de doute, fais afficher les premières valeurs avec print.

Sources

Programme visé : Programme de spécialité de mathématiques de terminale générale · education.gouv.fr

  1. Programme de spécialité de mathématiques de terminale générale, education.gouv.fr. Consulté le 7 novembre 2026.
  2. Ressource Éduscol - Approche par dichotomie et algorithmes, eduscol.education.fr. Consulté le 7 novembre 2026.
  3. Diaporama Algorithmique - Ressources Lycée, ac-strasbourg.fr. Consulté le 7 novembre 2026.
  4. Algorithme TCP, Wikipédia. Consulté le 7 novembre 2026.

Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.

Signaler une erreur sur cette page

Je suis en…

Primaire

  • CP Bientôt
  • CE1 Bientôt
  • CE2 Bientôt
  • CM1 Bientôt
  • CM2 Bientôt

Collège

Lycée

Supérieur

  • BTS Bientôt
  • BUT Bientôt
  • Licence Bientôt
  • Prépas Bientôt

Sur cette page