
TP-Cours ITC 02
Recherche séquentielle dans un tableau unidimensionnel
I. Recherche d'un élément
I.1 Algorithme : boucle conditionnelle (while) ou inconditionnelle (for) ?
On souhaite écrire la fonction
recherche(a:list,x:int)➞bool permettant de déterminer si un entier x est présent ou non dans le tableau a. Le résultat renvoyé par cette fonction sera donc un booléen (True/False). Bien sûr, on s’interdit d’utiliser l’expression x in a qui est spécifique à Python et qui peut cacher un algorithme que l’on ne maîtrise pas.
L’idée la plus simple consiste à considérer a priori que x n’est pas dans a pour ensuite parcourir tout le tableau et modifier la valeur d’une variable booléenne en conséquence SI on rencontre x en parcourant a. Voici cet algorithme mis en œuvre :
À présent, nous allons modifier la fonction précédente en utilisant une propriété de l’instruction
return: lorsque le flux d’exécution du code rencontre sur une instruction return, la fonction contenant cette instruction renvoie un résultat et le flux d’exécution se poursuit à la suite de l’appel de cette fonction En particulier, les instructions suivant un return à l’intérieur d’une fonction ne sont pas exécutées !
Il est possible d’utiliser cette propriété de
return ceci à notre avantage : par exemple, pour sortir d’une boucle for contenue dans une fonction avant d’avoir accompli toutes les itérations de cette boucle.
Ici, la fonction
recherche s’achève avec return True dès lors qu’un élément de la liste a vaut x et si le flux d’exécution arrive sur l’instruction return False, cela signifie que la boucle for s’est déroulée entièrement en testant tous les éléments de a mais sans avoir trouvé un élément de a de valeur x: la fonction recherche renvoie bien le résultat attendu.
Boucle while ?
D’aucuns pensent que l’utilisation d’un
return pour forcer l’arrêt d’une boucle for est une (mauvaise) habitude qui doit être évitée si c’est possible.
Nous allons donc modifier cette boucle pour effectuer des tests successifs sur les éléments de
a tant que c’est possible (on utilisera pour ces tests un indice i qui devra rester strictement inférieur à len(a)à l’intérieur de la boucle) et tant que l’élément observé dans a n’a pas comme valeur x. Notre nouvelle version de la fonction recherche utilisera donc une boucle while et testera en fin de boucle si tous les éléments de a ont été testés ou non pour déterminer si x est dans a (ou non).
I.2 Première occurrence, liste des occurrences
Toutefois, la boucle
while n’est pas toujours recommandée ! Tout dépend de la question posée et pour répondre à certaines questions classiques sur les tableaux, il faut parfois parcourir la totalité de ce tableau. Par exemple, lorsqu’on souhaite obtenir le nombre d’occurrences de x dans a (La valeur renvoyée par cette fonction est donc un entier de len(a)a pour écrire votre fonction.
II. Recherche du maximum et du second maximum
II.1 Recherche du maximum d'un tableau, nombre de maximums
On suppose ici qu’on travaille sur un tableau (représenté par la liste
a) d’entiers. On se propose de trouver le plus grand entier du tableau appelé maximum du tableau/de a. L’algorithme accomplissant cette tâche est très simple. La variable max est initialisée à a[0] car on envisage la possibilité que le maximum de a soit le premier élément de a. On parcourt ensuite la totalité du tableau et lorsqu’on/si on rencontre un entier strictement plus grand que max, on fait évoluer la valeur de max.
II.2 Recherche du maximum et du second maximum
On souhaite écrire une fonction qui détermine les deux plus grands éléments d’un tableau d’entiers (représenté par une liste) ainsi que leurs indices de première occurrence respectifs dans ce tableau. Avant d’aller plus loin, songez bien que ces deux plus grands éléments peuvent être égaux !


