💻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)
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 :
Pour calculer , on part de et on applique 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 uLe _ est une variable « poubelle » : on ne s'en sert pas, on veut juste répéter n fois. Après la boucle, u contient .
Pour programmer une suite récurrente :
- Initialise la variable avec le premier terme (souvent ).
- Répète exactement
nfois avecfor _ in range(n):. - À chaque tour, réaffecte la variable :
u = (expression de u). - Renvoie la variable après la boucle.
Avec u(0) : la boucle for _ in range(0) ne tourne pas, on renvoie directement 3 (c'est ).
Avec u(2) : u = 3 → 2*3+1 = 7 → 2*7+1 = 15. Donc u(2) vaut 15.
range(n) produit n valeurs (de 0 à n-1), donc la boucle tourne n fois. Pour obtenir à partir de , c'est exactement ce qu'il faut : n applications de la relation.
Recherche de seuil (boucle while)
Question typique : « à partir de quel rang a-t-on ? ». 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.
Pour une recherche de seuil :
- Initialise la valeur
u(premier terme) et le compteurn = 0. - Boucle
whileavec la condition « pas encore atteint » (iciu <= 1000). - Dans la boucle : mets
uà jour puis incrémenten. - Renvoie
n(ouu, selon la question).
Pour , : 3 → 7 → 15 → 31 → 63 → 127 → 255 → 511 → 1023. On a dépassé 1000 au 9ᵉ pas, donc seuil() renvoie 9 (c'est ).
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
Pour calculer , 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 SIci somme(n) calcule (soit n+1 termes).
Pour une somme de termes :
- Crée un accumulateur (
S = 0, ouS = u_0si le premier terme est déjà connu). - À chaque tour de boucle, calcule le terme puis fais
S = S + terme. - Renvoie
Sà la fin.
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 ).
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 ?
Le choix de la boucle dépend de ce que tu sais à l'avance :
for: tu connais le nombre d'étapes (« calcule », « fais 100 itérations »). On écritfor _ 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 ? « Non majorée » veut dire exactement qu'aucun plafond ne tient : pour ce , il existe forcément un rang avec . Et comme la suite est croissante, une fois passé au-dessus elle y reste : tous les termes suivants dépassent aussi . La boucle while s'arrête donc à coup sûr. Attention au piège inverse : une suite peut être croissante et bornée, comme qui grimpe () mais n'atteint jamais — un while u < 2 tournerait alors à l'infini. C'est bien l'absence de majorant, pas la simple croissance, qui garantit l'arrêt.
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 ? ».
« Calcule la somme des 50 premiers termes » → for.
« Trouve le premier rang où » → while u >= 0.01.
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
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 à partir de , 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 uPour 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.
Pour éviter le décalage :
- Écris à la main les premiers tours (
u(0),u(1),u(2)). - Vérifie que
u(0)renvoie bien (boucle vide). - Compte les applications :
range(n)⇒ntours, pas un de plus.
Avec , : 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)).
Le test à 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