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\).