+ qu'un profMon espace

Terminale Spé Maths / Chapitre 1 : Suites

Fiche 6 : algorithmique et Python

Sept exercices sur les questions de programmation que l'on retrouve régulièrement dans les exercices de suites du bac : calculer un terme, trouver un seuil, calculer une somme, compléter ou interpréter un script.

Bonne nouvelle : ces questions sont presque toujours des points « cadeaux » si tu connais les trois modèles ci-dessous.

Toutes les corrections sont rédigées comme on l'attend au bac : exécution pas à pas, justification de la valeur renvoyée, justification de la terminaison quand elle est demandée.

💡 Les trois modèles à connaître

1. Calculer le terme unu_n (boucle for) : on part de u0u_0, on applique la relation de récurrence nn fois.

def terme(n):
    u = 2
    for i in range(n):
        u = 3*u - 1
    return u

2. Trouver un seuil (boucle while) : on avance tant que la condition n'est pas atteinte, et on compte les étapes.

def seuil():
    n = 0
    u = 1000
    while u < 2000:
        u = 1.05*u
        n = n + 1
    return n

3. Calculer une somme : on ajoute chaque terme à une variable qui sert de compteur.

def somme(n):
    u = 1
    s = 1
    for i in range(n):
        u = u/2
        s = s + u
    return s

⚠️ Les pièges classiques

  • Le seuil renvoie nn, pas unu_n. Relis la question : « le plus petit entier nn » veut dire qu'on renvoie le compteur.
  • L'ordre des instructions dans la boucle : mettre à jour u avant ou après n = n + 1 ne change pas le résultat ici, mais si u et n se servent l'un de l'autre, ça change tout.
  • La condition du while est l'inverse de ce qu'on cherche : on cherche un≥Au_n\ge A, donc on boucle tant que u < A.
  • Confondre < et <= (ou > et >=) : lis l'énoncé au symbole près.
  • range(n) répète nn fois, avec i qui va de 00 à n−1n-1.

Astuce : exécute le script à la main sur les deux ou trois premières étapes, avec un tableau de valeurs. C'est la méthode qui évite 95 % des erreurs. 😄 Un script qui « a l'air juste » n'est pas un script vérifié.


Exercice 1 (★) : que renvoie ce script ?

On considère la suite définie par u0=2u_0=2 et un+1=3un−1u_{n+1}=3u_n-1. Que renvoie l'appel terme(3) du modèle 1 ci-dessus ?

✏️ Correction de l'exercice 1

Exécution à la main

On exécute le script à la main avec n = 3. La boucle for i in range(3) s'exécute 33 fois (i=0,1,2i=0{,}1{,}2).

• Avant la boucle : u = 2.

• i=0i=0 : u=3×2−1=5u=3\times2-1=5.

• i=1i=1 : u=3×5−1=14u=3\times5-1=14.

• i=2i=2 : u=3×14−1=41u=3\times14-1=41.

✅ La fonction renvoie 4141, c'est-à-dire u3u_3.

À chaque passage, la variable u contient le terme suivant de la suite, donc après 33 passages elle contient u3u_3.


Exercice 2 (★) : écrire une fonction

On définit u0=3u_0=3 et un+1=0,5 un+2u_{n+1}=0{,}5\,u_n+2. Écrire une fonction Python terme(n) qui renvoie unu_n, puis calculer terme(3) à la main.

✏️ Correction de l'exercice 2

Le script

def terme(n):
    u = 3
    for i in range(n):
        u = 0.5*u + 2
    return u

La variable u est initialisée à u0=3u_0=3, puis la relation un+1=0,5 un+2u_{n+1}=0{,}5\,u_n+2 est appliquée nn fois : la fonction renvoie bien unu_n.

Exécution pour n=3n=3

u0=3u_0=3

u1=0,5×3+2=3,5u_1=0{,}5\times3+2=3{,}5

u2=0,5×3,5+2=3,75u_2=0{,}5\times3{,}5+2=3{,}75

u3=0,5×3,75+2=3,875u_3=0{,}5\times3{,}75+2=3{,}875

✅ terme(3) renvoie 3,8753{,}875.


Exercice 3 (★★) : un seuil à la baisse

Une machine vaut 5 000 € à l'achat et perd 10 % de sa valeur chaque année. On note unu_n sa valeur au bout de nn années.

1. Exprimer unu_n en fonction de nn.

2. Écrire une fonction Python qui renvoie le plus petit entier nn tel que un<2000u_n<2000.

3. Quelle valeur renvoie-t-elle ?

✏️ Correction de l'exercice 3

Question 1

Perdre 10 %10\,\% de sa valeur revient à multiplier par 0,90{,}9. La suite (un)(u_n) est donc géométrique de raison 0,90{,}9 et de premier terme u0=5000u_0=5000.

✅ Donc, pour tout n∈Nn\in\N, un=5000×0,9nu_n=5000\times0{,}9^n.

Question 2

On boucle tant que la valeur est encore supérieure ou égale à 20002000, et on compte les années :

def seuil():
    n = 0
    u = 5000
    while u >= 2000:
        u = 0.9*u
        n = n + 1
    return n

Terminaison : comme −1<0,9<1-1<0{,}9<1, un=5000×0,9nu_n=5000\times0{,}9^n tend vers 00. Il existe donc un rang à partir duquel un<2000u_n<2000 : la condition u >= 2000 finit par être fausse et la boucle s'arrête.

Question 3

On cherche le plus petit entier nn tel que 5000×0,9n<20005000\times0{,}9^n<2000, soit 0,9n<0,40{,}9^n<0{,}4. La suite (0,9n)(0{,}9^n) est strictement décroissante, et :

0,98≈0,4305≥0,40{,}9^8\approx0{,}4305\ge0{,}4

0,99≈0,3874<0,40{,}9^9\approx0{,}3874<0{,}4

✅ La fonction renvoie 99.

Piège évité : la suite décroît, donc la condition du while est u >= 2000 (on continue tant qu'on n'est pas passé sous le seuil).


Exercice 4 (★★) : une somme et son seuil

Pour n∈Nn\in\N, on pose Sn=1+12+14+⋯+12nS_n=1+\dfrac12+\dfrac14+\dots+\dfrac1{2^n}.

1. Écrire une fonction Python somme(n) qui renvoie SnS_n. Que renvoie somme(3) ?

2. On rappelle que Sn=2−12nS_n=2-\dfrac1{2^n}. Écrire une fonction qui renvoie le plus petit entier nn tel que 2−Sn<0,012-S_n<0{,}01. Quelle valeur renvoie-t-elle ?

✏️ Correction de l'exercice 4

Question 1

def somme(n):
    u = 1
    s = 1
    for i in range(n):
        u = u/2
        s = s + u
    return s

La variable u contient successivement 12\dfrac12, 14\dfrac14, 18\dfrac18…, et s cumule les termes : après nn passages, s=1+12+⋯+12n=Sns=1+\dfrac12+\dots+\dfrac1{2^n}=S_n.

Exécution pour n=3n=3 : s = 1, puis u = 0.5 et s = 1.5, puis u = 0.25 et s = 1.75, puis u = 0.125 et s = 1.875.

✅ somme(3) renvoie 1,8751{,}875.

Question 2

Comme Sn=2−12nS_n=2-\dfrac1{2^n}, on a 2−Sn=12n2-S_n=\dfrac1{2^n}. On cherche le plus petit entier nn tel que 12n<0,01\dfrac1{2^n}<0{,}01. Voici une fonction possible :

def seuil():
    n = 0
    while 1/2**n >= 0.01:
        n = n + 1
    return n

Terminaison : comme −1<12<1-1<\dfrac12<1, 12n→0\dfrac1{2^n}\to0, donc 12n\dfrac1{2^n} finit par être inférieur à 0,010{,}01 et la boucle s'arrête.

Valeur renvoyée : 12n<0,01  ⟺  2n>100\dfrac1{2^n}<0{,}01\iff2^n>100. Comme 26=64<1002^6=64<100 et 27=128>1002^7=128>100, et que 2n2^n est croissante, le plus petit entier convenable est n=7n=7.

✅ La fonction renvoie 77.


Exercice 5 (★★★) : compléter un script (type bac)

Dans l'exercice du parc animalier (fiche 4, exercice 4), on a u0=800u_0=800 et un+1=0,9 un+60u_{n+1}=0{,}9\,u_n+60.

On souhaite savoir à partir de quelle année (nn) le parc compte moins de 650 animaux.

Recopier et compléter le script :

def annee():
    n = ......
    u = ......
    while ......:
        u = ......
        n = ......
    return n
✏️ Correction de l'exercice 5

Le script complété

def annee():
    n = 0
    u = 800
    while u >= 650:
        u = 0.9*u + 60
        n = n + 1
    return n

Justification des compléments : on part de n = 0 et u = u_0 = 800.

On continue tant que u >= 650, car on cherche le premier moment où u passe sous 650650.

À chaque passage, u devient 0.9*u + 60, c'est-à-dire le terme suivant, et n compte le rang.

Terminaison : un=600+200×0,9nu_n=600+200\times0{,}9^n tend vers 600<650600<650, donc unu_n finit par être strictement inférieur à 650650.

Valeur renvoyée : un=600+200×0,9nu_n=600+200\times0{,}9^n donne :

u13≈650,8≥650u_{13}\approx650{,}8\ge650

u14≈645,8<650u_{14}\approx645{,}8<650

✅ La fonction renvoie 1414, ce qui correspond à l'année 20402040.


Exercice 6 (★★★) : conjecturer une limite

Reprenons u0=0u_0=0 et un+1=11+unu_{n+1}=\dfrac1{1+u_n} (fiche 5, exercice 5).

1. Écrire un script Python qui affiche les termes u1u_1 à u10u_{10}.

2. Donner les valeurs approchées obtenues et conjecturer la limite.

✏️ Correction de l'exercice 6

Question 1

u = 0
for n in range(1, 11):
    u = 1/(1 + u)
    print(n, u)

Au nn-ième passage, u devient unu_n, que l'on affiche avec son rang n.

Question 2

Valeurs approchées :

u1=1u_1=1, u2=0,5u_2=0{,}5, u3≈0,6667u_3\approx0{,}6667, u4=0,6u_4=0{,}6, u5=0,625u_5=0{,}625

u6≈0,6154u_6\approx0{,}6154, u7≈0,6190u_7\approx0{,}6190, u8≈0,6176u_8\approx0{,}6176, u9≈0,6182u_9\approx0{,}6182, u10≈0,6180u_{10}\approx0{,}6180

Les termes alternent au-dessus et en dessous d'une valeur voisine de 0,6180{,}618 en s'en rapprochant.

✅ On conjecture que (un)(u_n) converge vers 5−12≈0,618\dfrac{\sqrt5-1}2\approx0{,}618.

Cette conjecture n'est pas une preuve : elle est cohérente avec la limite calculée dans la fiche 5 (à condition d'admettre la convergence).

Remarque : les termes alternent, ce qui confirme que la suite n'est pas monotone, comme on l'avait vu en fiche 5.


Exercice 7 (★★★) : pourquoi l'algorithme s'arrête-t-il ?

On définit u0=1u_0=1 et un+1=2un+1u_{n+1}=2u_n+1. Pour un réel AA, on considère la fonction :

def seuil(A):
    n = 0
    u = 1
    while u <= A:
        u = 2*u + 1
        n = n + 1
    return n

1. Que renvoie seuil(1000) ? (On admet que un=2n+1−1u_n=2^{n+1}-1.)

2. Pourquoi peut-on affirmer que cet algorithme s'arrête pour tout réel AA ?

✏️ Correction de l'exercice 7

Question 1

La fonction seuil(1000) renvoie le plus petit entier nn tel que un>1000u_n>1000, c'est-à-dire 2n+1−1>10002^{n+1}-1>1000, soit 2n+1>10012^{n+1}>1001.

Comme 29=512<10012^9=512<1001 et 210=1024>10012^{10}=1024>1001, et que 2k2^k est croissante en kk, le plus petit entier convenable vérifie n+1=10n+1=10, donc n=9n=9.

Vérification : u8=511≤1000u_8=511\le1000 et u9=1023>1000u_9=1023>1000.

✅ La fonction renvoie 99.

Question 2

On a un=2n+1−1=2×2n−1u_n=2^{n+1}-1=2\times2^n-1. Comme 2>12>1, 2n→+∞2^n\to+\infty, donc, par produit et par somme, un→+∞u_n\to+\infty.

Par définition de la limite, pour tout réel AA, il existe un rang n0n_0 tel que un>Au_n>A dès que n≥n0n\ge n_0. Donc la condition u <= A devient fausse après un nombre fini de passages :

✅ la boucle se termine, quel que soit AA.

À retenir : « pourquoi l'algorithme se termine » se justifie toujours par une limite infinie (ou par une limite qui franchit le seuil). C'est un point que les correcteurs adorent.


🎯 Ce qui peut tomber au bac

  • Un script à exécuter à la main ou dont on donne la valeur renvoyée (exercices 1, 2, 5).
  • Un seuil à programmer avec une boucle while (exercices 3, 4, 7).
  • Une justification de la terminaison par une limite (exercices 3, 4, 5 et 7).
  • Un script qui affiche des termes pour conjecturer une limite (exercice 6).

QCM : vérifie tes acquis

10 questions, une seule bonne réponse chacune. Choisis une réponse : la correction s'affiche tout de suite. Ton score est enregistré dans Mon espace.

Question 1 sur 10

Dans `while u < 100:`, la boucle s'arrête quand :

Question 2 sur 10

Avec `u = 1` puis `for k in range(3): u = 2*u + 1`, que vaut `u` à la fin ?

Question 3 sur 10

Pour u0=100u_0=100 et un+1=0,5 unu_{n+1}=0{,}5\,u_n, quel est le premier rang nn tel que un<1u_n<1 ?

Question 4 sur 10

`range(1, n+1)` parcourt :

Question 5 sur 10

Une boucle `while` dont la condition ne devient jamais fausse :

Question 6 sur 10

Dans l'exercice 1, avec u0=2u_0=2 et un+1=3un−1u_{n+1}=3u_n-1, que renvoie `terme(3)` ?

Question 7 sur 10

Dans l'exercice 2, avec u0=3u_0=3 et un+1=0,5 un+2u_{n+1}=0{,}5\,u_n+2, que renvoie `terme(3)` ?

Question 8 sur 10

Dans l'exercice 3 (la machine qui perd 10 %10\,\% de sa valeur par an, u0=5 000u_0=5\,000), au bout de combien d'années la valeur passe-t-elle sous 2 0002\,000 € ?

Question 9 sur 10

Dans l'exercice 4, avec Sn=1+12+⋯+12nS_n=1+\dfrac12+\dots+\dfrac1{2^n}, que renvoie `somme(3)` ?

Question 10 sur 10

Dans l'exercice 7, avec u0=1u_0=1, un+1=2un+1u_{n+1}=2u_n+1 et la fonction `seuil(A)` du script, que renvoie `seuil(1000)` ?

Un doute sur ce chapitre ? On en parle ensemble, sans engagement.

Réserver un appel découverte