Adloun

mathématiques appliquées (ECG 1re année) · Chapitre 11 · Application directe du cours

Compter et localiser

Informatique et algorithmique · Boucles et listes · niveau 1 (application)

Énoncé

Écrire compte_pairs(L) qui renvoie le nombre d'éléments pairs d'une liste d'entiers, puis positions(L, x) qui renvoie la liste de tous les indices où x apparaît.

Corrigé

Le code.

def compte_pairs(L):
    c = 0
    for x in L:
        if x % 2 == 0:
            c = c + 1
    return c

def positions(L, x):
    P = []
    for i in range(len(L)):     # on parcourt les INDICES, pas les valeurs
        if L[i] == x:
            P.append(i)
    return P

print(compte_pairs([3, 8, 4, 7, 10]))      # 3
print(positions([5, 2, 5, 9, 5], 5))       # [0, 2, 4]
print(positions([5, 2, 5, 9, 5], 7))       # []

Le test de parité. x % 2 est le reste de la division euclidienne de x par : il vaut si et seulement si x est pair. Le test fonctionne aussi pour les entiers négatifs en Python, où -4 % 2 vaut .

Pourquoi parcourir les indices dans la seconde fonction. La boucle for x in L donne les valeurs, et l'on ne saurait pas où elles se trouvent. Comme on cherche des positions, il faut parcourir range(len(L)) et accéder à L[i].

Le cas où x est absent. La liste P reste vide et la fonction rend []. C'est le comportement souhaitable : rendre None ou obligerait l'appelant à distinguer deux types de réponses, alors qu'une liste vide se traite comme n'importe quelle autre — par exemple avec len(positions(L, x)), qui compte les occurrences.

Le coût. Chaque fonction fait un seul parcours, soit de l'ordre de opérations.

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre