Deux questions se posent avant d'écrire : quelle structure de boucle, et faut-il garder les valeurs ou seulement la dernière.
Choisir sa boucle
Question posée |
Boucle |
|---|---|
« Calculer les 20 premiers termes » |
\(\text{for}\), 20 tours connus |
« À partir de quel rang dépasse-t-on 1000 ? » |
\(\text{while}\), on ne sait pas d'avance |
« Additionner tous les éléments d'une liste » |
\(\text{for}\) sur la liste |
Un \(\text{while}\) dont la condition ne peut jamais devenir fausse tourne indéfiniment : vérifier que quelque chose change à l'intérieur de la boucle.
Chercher un seuil
C'est le programme type du chapitre : on avance tant qu'on n'a pas dépassé, en comptant les tours.
Exemple :
À partir de quel rang la suite \(u_{n+1} = 1.05 \, u_n\), de premier terme \(u_0 = 100\), dépasse-t-elle \(200\) ?
u = 100
n = 0
while u <= 200:
u = 1.05 * u
n = n + 1
print(n)
Le programme affiche \(15\) : c'est le premier rang pour lequel \(u_n > 200\).
L'ordre des deux lignes dans la boucle compte : on calcule le terme suivant, puis on incrémente le rang. Inverser décale la réponse d'une unité.
Construire une liste
Trois écritures pour le même résultat. On choisit la compréhension quand la règle est simple, les ajouts successifs quand chaque terme dépend du précédent.
Règle directe :
L = [2 * k + 1 for k in range(10)]
Récurrence :
L = [3]
for k in range(9):
L.append(2 * L[-1])
Une suite définie par récurrence ne peut pas s'écrire en compréhension : chaque terme a besoin du précédent, qui n'existe pas encore.
Lire un programme sans l'exécuter
On dresse un tableau de suivi, une colonne par variable, une ligne par tour.
Exemple :
s = 0
for k in range(1, 5):
s = s + k * k
print(s)
Tour |
\(k\) |
\(k^2\) |
\(s\) après |
|---|---|---|---|
\(1\) |
\(1\) |
\(1\) |
\(1\) |
\(2\) |
\(2\) |
\(4\) |
\(5\) |
\(3\) |
\(3\) |
\(9\) |
\(14\) |
\(4\) |
\(4\) |
\(16\) |
\(30\) |
Le piège de \(\text{range}(1, 5)\) : il s'arrête à \(4\), la borne haute étant exclue. \(\text{range}(n)\) va de \(0\) à \(n-1\).