Algorithmique

Algorithmique et Python

Listes, boucles, fonctions et les algorithmes qui tombent au bac

Tout est gratuit et lisible sans compte. Crée ton compte gratuit pour garder ta progression.

Ce que tu dois savoir faire
  • Lire, compléter et écrire une fonction Python avec def, return, if, for et while
  • Créer une liste en extension ou en compréhension, y ajouter ou retirer des éléments, la parcourir
  • Calculer les termes d'une suite et programmer une recherche de seuil
  • Programmer la dichotomie, la méthode d'Euler et la méthode des rectangles
  • Simuler une expérience aléatoire, un échantillon, et estimer une probabilité par une fréquence

1. Les bases à maîtriser

Au bac, l'algorithmique n'est pas une épreuve séparée : elle apparaît dans les exercices (suites, fonctions, probabilités). On te demande le plus souvent de compléter une fonction, de dire ce qu'elle renvoie, ou d'en interpréter le résultat. Il faut donc savoir lire du Python sans hésiter.

L’essentiel de la syntaxe

instructionrôleexemple
x = 3affectation : reçoit la valeur n = n + 1 augmente de
x == 3test d'égalité (vrai ou faux)if x == 3:
** , % , //puissance, reste, quotient entier2**3 vaut , 17 % 5 vaut
def f(x): … return …définir une fonction qui renvoie un résultatreturn x**2
for k in range(n):répéter fois, allant de à range(2, 8, 2) donne
while condition:répéter tant que la condition est vraiewhile u < 100:
Méthode — Trois structures, un exemple chacune
def f(x):
    return x**2 - 3*x + 1      # une fonction mathématique

print(f(2))                     # affiche -1

n = 0
while 2**n < 1000:              # tant que la condition est vraie…
    n = n + 1                   # …on recommence
print(n)                        # 10, car 2**9 = 512 et 2**10 = 1024

for k in range(5):              # k prend les valeurs 0, 1, 2, 3, 4
    if k % 2 == 0:              # k % 2 est le reste de la division par 2
        print(k, "est pair")
    else:
        print(k, "est impair")
Piège fréquent

range(n) s'arrête avant : range(5) donne (cinq valeurs). Et l'indentation (le décalage du début de ligne) fait partie du langage : c'est elle qui indique ce qui est à l'intérieur d'une boucle ou d'un if.

Conseil bac

Pour comprendre un programme, fais-le « tourner à la main » : un tableau avec une colonne par variable et une ligne par passage dans la boucle. C'est exactement ce qu'attend le correcteur quand on te demande « quelle valeur renvoie… ».

2. Les listes

Définition — Liste

Une liste est une suite ordonnée de valeurs, écrite entre crochets : L = [3, 1, 4, 1, 5]. Chaque élément est repéré par son indice, qui commence à . len(L) est le nombre d'éléments.

Indices d’une liste

L = 31415 L[0]L[1]L[2]L[3]L[4] L[-5]L[-4]L[-3]L[-2]L[-1] len(L) = 5 : les indices vont de 0 à 4 (et de −5 à −1 en partant de la fin)

L[0] est le premier élément, L[-1] le dernier. L[5] provoque une erreur : il n'y a pas d'élément d'indice .

Opérations sur les listes

écritureeffet
[]liste vide
L.append(x)ajoute à la fin de la liste
L.pop()retire (et renvoie) le dernier élément
L.remove(x)retire la première occurrence de
L[i] = xremplace l'élément d'indice
[expr for k in range(n)]liste en compréhension
[expr for k in range(n) if cond]en compréhension, avec un filtre
sum(L), max(L), min(L)somme, maximum, minimum (listes de nombres)
Méthode — Créer et modifier une liste
L = [3, 1, 4, 1, 5]        # liste définie en extension
L.append(9)                # ajoute 9 à la fin : [3, 1, 4, 1, 5, 9]
print(len(L), L[0], L[-1]) # 6 3 9
L.pop()                    # retire le dernier élément : [3, 1, 4, 1, 5]
L.remove(1)                # retire le PREMIER 1 rencontré : [3, 4, 1, 5]
L[0] = 7                   # modifie un élément : [7, 4, 1, 5]

carres = [k**2 for k in range(6)]             # en compréhension : [0, 1, 4, 9, 16, 25]
pairs = [k for k in range(20) if k % 2 == 0]  # avec une condition : [0, 2, 4, ..., 18]
Méthode — Parcourir une liste

On peut parcourir les éléments (for x in L) ou les indices (for i in range(len(L))), quand on a besoin de la position.

def moyenne(L):
    s = 0
    for x in L:            # parcours par les éléments
        s = s + x
    return s / len(L)

def maximum(L):
    m = L[0]
    for i in range(1, len(L)):   # parcours par les indices
        if L[i] > m:
            m = L[i]
    return m

print(moyenne([12, 15, 9]), maximum([12, 15, 9]))   # 12.0 15

3. Suites : termes et seuils

Méthode — Calculer les termes d’une suite récurrente

Une seule variable u suffit : à chaque tour de boucle, on la remplace par le terme suivant. Pour garder tous les termes, on les ajoute à une liste avec append.

def termes(n):
    """Liste des termes u0, ..., un de la suite u0 = 2, u(k+1) = 0.5 u(k) + 3."""
    u = 2
    L = [u]
    for k in range(n):
        u = 0.5 * u + 3
        L.append(u)
    return L

print(termes(5))   # [2, 4.0, 5.0, 5.5, 5.75, 5.875] : la suite semble tendre vers 6
123456789101234560u(n+1) = 0,5 u(n) + 3, u(0) = 2

Les termes calculés par termes(10) : la suite croît et se rapproche de (on peut montrer que ).

Méthode — L’algorithme de seuil

Pour trouver le premier rang à partir duquel une condition est vérifiée, on utilise une boucle while dont la condition est le contraire de celle qu'on cherche : on continue tant qu'on n'y est pas.

def seuil(s):
    """Premier n tel que 100 * 0.8**n < s (médicament éliminé de 20 % par heure)."""
    n = 0
    u = 100
    while u >= s:          # condition CONTRAIRE de celle qu'on cherche
        u = 0.8 * u
        n = n + 1
    return n

print(seuil(5))   # 14
Piège fréquent

Si la suite ne dépasse jamais le seuil, la boucle while ne s'arrête pas ! Avant d'utiliser un algorithme de seuil, il faut savoir (par la limite) que le seuil sera atteint. Exemple : chercher le premier tel que pour la suite précédente, qui reste sous , ferait tourner le programme indéfiniment.

4. Analyse : dichotomie, Euler, aires

Méthode — La dichotomie

Si est continue sur et change de signe, l'équation a une solution dans (théorème des valeurs intermédiaires). On coupe l'intervalle en deux, on garde la moitié où change de signe, et on recommence : la longueur est divisée par à chaque étape.

def f(x):
    return x**2 - 2

def dichotomie(a, b, precision):
    """f change de signe sur [a ; b] : on encadre la solution de f(x) = 0."""
    while b - a > precision:
        m = (a + b) / 2
        if f(a) * f(m) <= 0:   # changement de signe entre a et m
            b = m
        else:                  # sinon, il est entre m et b
            a = m
    return a, b

print(dichotomie(1, 2, 0.001))   # (1.4140625, 1.4150390625) : encadrement de racine de 2
11,251,51,752−1,5−1−0,50,511,52√2 ≈ 1,414y = x² − 2

Les intervalles successifs : , , , … ils emprisonnent . Après étapes, la longueur est .

Méthode — La méthode d’Euler

Pour approcher la solution de avec : on avance pas à pas en suivant la tangente, .

def euler(a, b, y0, h, n):
    """Points approchés de la solution de y' = a y + b, y(0) = y0, avec n pas de longueur h."""
    t = 0
    y = y0
    points = [(t, y)]
    for k in range(n):
        y = y + h * (a * y + b)    # y(t + h) ≈ y(t) + h y'(t)
        t = t + h
        points.append((t, y))
    return points

print(euler(-0.2, 4, 0, 1, 3))   # [(0, 0), (1, 4.0), (2, 7.2), (3, 9.76)]

Avec un pas , l'approximation est grossière : la vraie valeur en est . Avec (et ), on trouve .

Méthode — Monte-Carlo : une aire par le hasard

On tire des points au hasard dans un carré ; la proportion de points sous une courbe approche l'aire (en proportion du carré). C'est une autre façon d'approcher une intégrale, comme la méthode des rectangles.

from random import random

def monte_carlo(n):
    """Approche pi : proportion de points du carré [0;1]² tombant sous le quart de cercle."""
    dedans = 0
    for i in range(n):
        x = random()
        y = random()
        if x**2 + y**2 <= 1:
            dedans = dedans + 1
    return 4 * dedans / n

print(monte_carlo(100000))   # environ 3.14 (le résultat change à chaque exécution)

5. Probabilités : simuler et compter

Méthode — Simuler une loi de Bernoulli, une loi binomiale, un échantillon

random() renvoie un nombre au hasard dans ; le test random() < p est donc vrai avec la probabilité . C'est la brique de toutes les simulations.

from random import random

def bernoulli(p):
    """Renvoie 1 avec la probabilité p, 0 sinon."""
    if random() < p:
        return 1
    else:
        return 0

def binomiale(n, p):
    """Simule une variable de loi B(n, p) : nombre de succès en n épreuves."""
    X = 0
    for i in range(n):
        X = X + bernoulli(p)
    return X

echantillon = [binomiale(20, 0.8) for j in range(1000)]   # 1000 simulations
print(sum(echantillon) / len(echantillon))                # proche de E(X) = 16
Propriété — Fréquence et probabilité

D'après la loi des grands nombres, sur un grand nombre de simulations, la fréquence d'un événement est proche de sa probabilité, et la moyenne des valeurs simulées est proche de l'espérance. Une simulation donne une estimation, jamais une valeur exacte : deux exécutions donnent des résultats différents.

Méthode — Les coefficients binomiaux par la relation de Pascal

La relation de Pascal permet de construire chaque ligne du triangle à partir de la précédente : chaque coefficient intérieur est la somme des deux coefficients situés au-dessus.

def ligne_pascal(n):
    """Ligne n du triangle de Pascal : les coefficients binomiaux (n parmi k)."""
    L = [1]
    for k in range(n):
        L = [1] + [L[i] + L[i + 1] for i in range(len(L) - 1)] + [1]
    return L

print(ligne_pascal(5))   # [1, 5, 10, 10, 5, 1]
Conseil bac

Pour calculer directement un coefficient binomial ou une probabilité binomiale, from math import comb donne comb(n, k). Mais au bac, on te demandera plutôt de comprendre une simulation : repère la variable qui compte (elle augmente de quand un événement se produit) et la division finale qui transforme un effectif en fréquence.

L’essentiel à retenir

  1. = affecte, == teste ; l'indentation délimite les blocs ; range(n) va de à .
  2. Les indices d'une liste commencent à ; L[-1] est le dernier élément ; len(L) donne la taille.
  3. L.append(x) ajoute à la fin, L.pop() retire le dernier, L.remove(x) retire la première occurrence de .
  4. Liste en compréhension : [k**2 for k in range(10) if k % 2 == 0].
  5. Seuil : boucle while avec la condition contraire de celle cherchée ; on renvoie le compteur .
  6. Dichotomie : la longueur de l'intervalle est divisée par à chaque étape.
  7. Euler : y = y + h * (a * y + b) ; plus est petit, meilleure est l'approximation.
  8. random() < p simule un succès de probabilité ; une fréquence simulée estime une probabilité.

Et pour t’entraîner : 10 QCM corrigés et 4 exercices type bac, avec indices et corrections rédigées.

Loading...