💻Suites et seuils en Python

Cours de mathématiques · Terminale

Calculer les termes d'une suite définie par récurrence à l'aide d'une boucle, rechercher le premier rang qui dépasse (ou descend sous) un seuil avec une boucle while, et accumuler une somme de termes. On traduit en Python des raisonnements déjà vus en analyse sur les suites.

Ce que tu vas savoir faire

  • Calculer le terme u(n) d'une suite récurrente avec une boucle for.
  • Trouver le premier rang n tel que u(n) dépasse un seuil avec une boucle while.
  • Calculer la somme des premiers termes d'une suite.
  • Prévoir ce que renvoie un programme qui itère une relation de récurrence.
  • Choisir entre boucle for (nombre d'étapes connu) et while (condition d'arrêt).

Calculer un terme par récurrence (boucle for)

Règle

Une suite récurrente est définie par son premier terme et une relation qui donne le terme suivant à partir du précédent. Par exemple :

u0=3,un+1=2un+1.u_0 = 3, \qquad u_{n+1} = 2\,u_n + 1.

Pour calculer unu_n, on part de u0u_0 et on applique nn fois la relation. En Python, on garde la valeur courante dans une variable u qu'on met à jour dans une boucle for répétée n fois :

def u(n):
    u = 3                 # u_0
    for _ in range(n):    # on applique la relation n fois
        u = 2 * u + 1     # u_{k+1} = 2*u_k + 1
    return u

Le _ est une variable « poubelle » : on ne s'en sert pas, on veut juste répéter n fois. Après la boucle, u contient unu_n.

Méthode

Pour programmer une suite récurrente :

  1. Initialise la variable avec le premier terme (souvent u0u_0).
  2. Répète exactement n fois avec for _ in range(n):.
  3. À chaque tour, réaffecte la variable : u = (expression de u).
  4. Renvoie la variable après la boucle.
Exemple

Avec u(0) : la boucle for _ in range(0) ne tourne pas, on renvoie directement 3 (c'est u0u_0).

Avec u(2) : u = 32*3+1 = 72*7+1 = 15. Donc u(2) vaut 15.

Astuce

range(n) produit n valeurs (de 0 à n-1), donc la boucle tourne n fois. Pour obtenir unu_n à partir de u0u_0, c'est exactement ce qu'il faut : n applications de la relation.

Recherche de seuil (boucle while)

Règle

Question typique : « à partir de quel rang nn a-t-on un>1000u_n > 1000 ? ». On ne connaît pas le nombre d'étapes à l'avance : on répète tant que la condition n'est pas atteinte. C'est le rôle de la boucle while :

def seuil():
    u = 3
    n = 0
    while u <= 1000:       # tant qu'on n'a pas dépassé
        u = 2 * u + 1
        n = n + 1          # on compte les étapes
    return n               # premier rang où u > 1000

À la sortie de la boucle, la condition u <= 1000 est fausse, donc u > 1000 : n est bien le premier rang qui dépasse le seuil.

Méthode

Pour une recherche de seuil :

  1. Initialise la valeur u (premier terme) et le compteur n = 0.
  2. Boucle while avec la condition « pas encore atteint » (ici u <= 1000).
  3. Dans la boucle : mets u à jour puis incrémente n.
  4. Renvoie n (ou u, selon la question).
Exemple

Pour u0=3u_0 = 3, un+1=2un+1u_{n+1} = 2u_n + 1 : 3 → 7 → 15 → 31 → 63 → 127 → 255 → 511 → 1023. On a dépassé 1000 au 9ᵉ pas, donc seuil() renvoie 9 (c'est u9=1023u_9 = 1023).

Astuce

Attention à l'ordre dans la boucle : si tu mets u à jour puis comptes n, le compteur correspond au rang atteint. Vérifie toujours que la condition while finira par devenir fausse, sinon : boucle infinie !

Somme des premiers termes

Règle

Pour calculer S=u0+u1++unS = u_0 + u_1 + \dots + u_n, on utilise un accumulateur : une variable S qui démarre à 0 et à laquelle on ajoute chaque terme au fur et à mesure.

def somme(n):
    u = 3
    S = u            # on ajoute déjà u_0
    for _ in range(n):
        u = 2 * u + 1
        S = S + u    # on ajoute le nouveau terme
    return S

Ici somme(n) calcule u0+u1++unu_0 + u_1 + \dots + u_n (soit n+1 termes).

Méthode

Pour une somme de termes :

  1. Crée un accumulateur (S = 0, ou S = u_0 si le premier terme est déjà connu).
  2. À chaque tour de boucle, calcule le terme puis fais S = S + terme.
  3. Renvoie S à la fin.
Exemple

somme(0) : la boucle ne tourne pas, S = u_0 = 3.

somme(2) : S = 3, puis u=7, S=10, puis u=15, S=25. Donc somme(2) vaut 25 (c'est 3+7+153 + 7 + 15).

Astuce

Ne confonds pas la valeur du dernier terme (u) et la somme accumulée (S). Ce sont deux variables différentes qui évoluent en parallèle.

for ou while : comment choisir ?

Règle

Le choix de la boucle dépend de ce que tu sais à l'avance :

  • for : tu connais le nombre d'étapes (« calcule u20u_{20} », « fais 100 itérations »). On écrit for _ in range(nb):.
  • while : tu connais une condition d'arrêt mais pas le nombre d'étapes (« jusqu'à dépasser 1000 », « tant que l'écart est trop grand »).

Une suite croissante non majorée dépasse forcément n'importe quel seuil : la boucle while s'arrête. Une suite décroissante minorée par 0 peut servir à un seuil du type while u > 0.001:.

⭐ Pour les curieux — pourquoi ça marche ? Pourquoi une suite croissante non majorée finit-elle toujours par dépasser un seuil MM ? « Non majorée » veut dire exactement qu'aucun plafond ne tient : pour ce MM, il existe forcément un rang pp avec up>Mu_p > M. Et comme la suite est croissante, une fois passé au-dessus elle y reste : tous les termes suivants dépassent aussi MM. La boucle while s'arrête donc à coup sûr. Attention au piège inverse : une suite peut être croissante et bornée, comme un=212nu_n = 2 - \dfrac{1}{2^n} qui grimpe (1,5;1,75;1,8751{,}5\,;\,1{,}75\,;\,1{,}875\dots) mais n'atteint jamais 22 — un while u < 2 tournerait alors à l'infini. C'est bien l'absence de majorant, pas la simple croissance, qui garantit l'arrêt.

Méthode

Petit réflexe : « combien de fois ? » → for. « jusqu'à quand ? » → while. En cas de doute sur un while, demande-toi : « ma condition finira-t-elle par devenir fausse ? ».

Exemple

« Calcule la somme des 50 premiers termes » → for. « Trouve le premier rang où un<0,01u_n < 0{,}01 » → while u >= 0.01.

Astuce

Une boucle while mal écrite peut tourner à l'infini. Dans la sandbox, ton code sera alors arrêté automatiquement : vérifie que la variable testée évolue bien à chaque tour.

L'erreur du décalage d'indice

Règle

L'erreur la plus fréquente est de se tromper du nombre de tours de boucle, ce qui décale tout d'un cran.

Rappel : for _ in range(n) exécute le bloc exactement n fois (les valeurs 0, 1, …, n-1). Pour calculer unu_n à partir de u0u_0, il faut donc appliquer la relation n fois — range(n) est correct, range(n+1) ferait un tour de trop.

def u(n):
    u = 3            # u_0
    for _ in range(n):   # n applications -> u_n
        u = 2 * u + 1
    return u

Pour une somme ou un seuil, c'est l'ordre des instructions dans la boucle (mise à jour de u puis du compteur, ou de l'accumulateur) qui doit être vérifié pas à pas sur un petit cas.

Méthode

Pour éviter le décalage :

  1. Écris à la main les premiers tours (u(0), u(1), u(2)).
  2. Vérifie que u(0) renvoie bien u0u_0 (boucle vide).
  3. Compte les applications : range(n)n tours, pas un de plus.
Exemple

Avec u0=3u_0=3, un+1=2un+1u_{n+1}=2u_n+1 : u(0) doit valoir 3 (boucle vide), u(1) vaut 2*3+1=7, u(2) vaut 2*7+1=15. Si u(0) te renvoie 7, c'est que tu fais un tour de trop (range(n+1)).

Astuce

Le test à 00 est ton meilleur ami : u(0) doit toujours renvoyer le premier terme sans entrer dans la boucle. Si ce n'est pas le cas, tu as un décalage.

Tu as lu le cours ? Passe à la pratique.

Un coach IA te guide sans jamais donner la réponse, avec des exercices et des quiz sur ce chapitre. Version d'essai gratuite, sans limite de durée.

S'entraîner avec le coach IA — gratuit