Algorithmes en lien avec le dénombrement, les suites et l'intégration
Algorithmes en lien avec le dénombrement, les suites et l'intégration
Avec des boucles (for, while), des conditions et des listes en Python, on fait calculer à la machine ce qui serait long à la main : compter des cas, trouver des termes et des seuils de suites, approcher une intégrale.
Objectifs
- Utiliser les structures de contrôle : boucle bornée for, boucle non bornée while, test if.
- Créer et parcourir des listes en Python.
- Écrire des algorithmes de dénombrement (factorielle, combinaisons, énumération).
- Calculer les termes d'une suite et déterminer un seuil.
- Approcher une intégrale par la méthode des rectangles.
1. Rappels : boucles, tests et listes
Une liste est une suite ordonnée de valeurs : L = [3, 7, 2]. On accède au premier élément par L[0], on ajoute un élément avec L.append(x), on obtient la longueur avec len(L). On peut aussi créer une liste « en compréhension » :
carres = [k**2 for k in range(1, 6)] # [1, 4, 9, 16, 25]
pairs = [k for k in range(10) if k % 2 == 0] # [0, 2, 4, 6, 8]
flowchart LR
A[Initialiser] --> B{Condition vraie}
B -- oui --> C[Executer le bloc]
C --> D[Mettre a jour]
D --> B
B -- non --> E[Afficher le resultat]
Que contient la liste [2*k + 1 for k in range(4)] ?
2. Algorithmes de dénombrement
Factorielle
Le nombre de façons de ranger \(n\) objets est \(n! = 1\times 2\times\cdots\times n\). L'idée de l'algorithme : partir de 1 et multiplier successivement par 2, 3, …, \(n\), comme on empile des briques une à une.
def factorielle(n):
p = 1
for k in range(1, n + 1):
p = p * k
return p
Trace de factorielle(5) : déroule les étapes.
Combinaisons
Le nombre de parties à \(k\) éléments d'un ensemble à \(n\) éléments est \(\binom{n}{k} = \dfrac{n!}{k!\,(n-k)!}\).
def combinaison(n, k):
return factorielle(n) // (factorielle(k) * factorielle(n - k))
Énumérer pour compter
Deux boucles imbriquées listent tous les duos \((i, j)\) avec \(i < j\) :
duos = []
for i in range(1, 6):
for j in range(i + 1, 6):
duos.append((i, j))
print(len(duos))
Que va afficher ce programme ? Cherche d'abord.
Voir la solution
Pour \(i=1\), \(j\) va de 2 à 5 : 4 duos ; pour \(i=2\) : 3 duos ; pour \(i=3\) : 2 ; pour \(i=4\) : 1 ; pour \(i=5\) : 0. Total \(4+3+2+1 = 10\).
On retrouve \(\binom{5}{2} = \dfrac{5!}{2!\,3!} = \dfrac{120}{2\times 6} = 10\) : les 5 candidats donnent 10 duos de délégués possibles.
Un code de cadenas comporte 4 chiffres de 0 à 9 (répétitions permises). Combien de tours fait la boucle la plus intérieure de 4 boucles imbriquées for … in range(10) ?
3. Algorithmes sur les suites
Calculer un terme et la liste des termes
Soit la suite définie par \(u_0 = 2\) et \(u_{n+1} = 0{,}5\,u_n + 3\).
def termes(n):
u = 2
L = [u]
for k in range(n):
u = 0.5 * u + 3
L.append(u)
return L
termes(4) renvoie [2, 4.0, 5.0, 5.5, 5.75] : \(u_1 = 0{,}5\times2+3 = 4\), \(u_2 = 5\), \(u_3 = 5{,}5\), \(u_4 = 5{,}75\). La suite semble converger vers \(6\) (en effet \(u_n = 6 - 4\times 0{,}5^n\)).
Manipule : la courbe de \(x\mapsto 6 - 4q^{x}\) passe par les points \((n ; u_n)\) quand \(q = 0{,}5\). Fais varier \(q\) entre 0 et 1 : la limite reste 6, mais l'approche est plus ou moins rapide.
Algorithme de seuil
def seuil(s):
n = 0
u = 2
while u <= s:
u = 0.5 * u + 3
n = n + 1
return n
Que renvoie seuil(5.9) ? Cherche d'abord.
Exemple résolu : l'épargne d'Awa
Écrire l'algorithme et trouver le nombre d'années.
Voir la solution
c = 100000
n = 0
while c <= 150000:
c = c * 1.05
n = n + 1
print(n)
On a \(c_n = 100\,000\times1{,}05^n\). Or \(1{,}05^8 \approx 1{,}477\) donc \(c_8 \approx 147\,746\) F CFA, et \(1{,}05^9 \approx 1{,}551\) donc \(c_9 \approx 155\,133\) F CFA. Le programme affiche \(9\) : il faut 9 ans.
Pourquoi utilise-t-on une boucle while (et non for) pour un algorithme de seuil ?
4. Approcher une intégrale : méthode des rectangles
On partage \([a;b]\) en \(n\) intervalles de largeur \(h = \dfrac{b-a}{n}\). Avec les rectangles « à gauche », la hauteur de chaque rectangle est la valeur de \(f\) au bord gauche :
\[ S_n = h\sum_{k=0}^{n-1} f(a + k h) \approx \int_a^b f(x)\,dx . \]Avec \(n = 4\) et \(h = 0{,}25\), chaque rectangle prend la hauteur de \(f\) au bord gauche (le premier a une hauteur nulle car \(f(0) = 0\)).
La somme des aires vaut \(S_4 \approx 0{,}219\) : c'est une valeur par défaut, car \(f\) est croissante et les rectangles restent sous la courbe.
def rectangles(f, a, b, n):
h = (b - a) / n
s = 0
for k in range(n):
s = s + f(a + k * h)
return h * s
def carre(x):
return x**2
print(rectangles(carre, 0, 1, 4))
Exemple résolu
Calculer à la main rectangles(carre, 0, 1, 4), puis comparer à \(\int_0^1 x^2\,dx\).
Pour une fonction croissante sur \([a;b]\), la méthode des rectangles à gauche donne :
Que faut-il changer pour obtenir les rectangles à droite dans la fonction rectangles ?
Récapitulatif
- for quand le nombre de tours est connu, while quand on attend qu'une condition change.
- Dénombrement : un produit accumulé pour \(n!\), des boucles imbriquées pour énumérer et vérifier une formule.
- Suites : une variable mise à jour dans une boucle ; un seuil se trouve avec while.
- Intégrale : \(S_n = h\sum_{k=0}^{n-1} f(a+kh)\) avec \(h = \frac{b-a}{n}\) ; plus \(n\) est grand, meilleure est l'approximation.
Teste tes connaissances sur ce cours
Crée ton compte gratuitement pour accéder aux quiz associés et suivre ta progression.
