L'indice du maximum☘
Exercice 1☘
Modifier le code (rappelé ci-dessous) permettant de déterminer la valeur maximale d'une liste de façon à renvoyer l'indice d'une occurrence du maximum plutôt que la valeur.
Rappel du code déterminant la valeur maximum
Le code que l'on a défini est le suivant:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def max_binaire(a,b): """ a et b sont deux variables de valeurs comparables. La fonction renvoie la plus grande des deux. """ if a > b: return a else: return b def max_tableau(tab): """ tab est une liste d'éléments comparables. La fonction renvoie l'élément le plus grand. """ m = tab[0] for x in tab: m = max_binaire(m,x) return m |
Un code possible pour l'indice du max
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | def indice_du_max_bin(t, i, j): """ t est une liste, non vide, d'éléments comparables. i et j sont deux indices de t. La fonction renvoie i si t[i] > t[j] et renvoie j sinon. """ if t[i] > t[j]: return i else: return j def indice_du_max_tableau(tab): """ tab est une liste, non vide, d'éléments comparables. La fonction renvoie l'indice d'une occurrence de la valeur maximale. """ k = 0 for j in range(1, len(tab)): k = indice_du_max_bin(tab, j, k) return k # test if __name__ == '__main__': from random import randint L = [ randint(1,10) for _ in range(randint(1,20))] print(L) k = indice_du_max_tableau(L) print(f"L[{k}] = {L[k]}") |
Exercice 2☘
Le code proposé en solution pour l'exercice précédent renvoie toujours le plus petit indice correspondant à une valeur maximale de la liste.
Proposez une modification de ce code pour renvoyer le plus grand indice correspondant à une valeur maximale de la liste.
Un code possible
On peut simplement remplacer ">" par ">=" dans la fonction
indice_du_max_bin
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | def indice_du_max_bin(t, i, j): """ t est une liste, non vide, d'éléments comparables. i et j sont deux indices de t. La fonction renvoie i si t[i] >= t[j] et renvoie j sinon. """ if t[i] >= t[j]: return i else: return j def indice_du_max_tableau(tab): """ tab est une liste, non vide, d'éléments comparables. La fonction renvoie l'indice d'une occurrence de la valeur maximale. """ k = 0 for j in range(1, len(tab)): k = indice_du_max_bin(tab, j, k) return k # test if __name__ == '__main__': from random import randint L = [ randint(1,10) for _ in range(randint(1,20))] print(L) k = indice_du_max_tableau(L) print(f"L[{k}] = {L[k]}") |
Ou, ce qui revient au même, échanger j et k à l'appel de indice_du_max_bin
dans
la boucle de la fonction indice_du_max_tableau
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | def indice_du_max_bin(t, i, j): """ t est une liste, non vide, d'éléments comparables. i et j sont deux indices de t. La fonction renvoie i si t[i] > t[j] et renvoie j sinon. """ if t[i] > t[j]: return i else: return j def indice_du_max_tableau(tab): """ tab est une liste, non vide, d'éléments comparables. La fonction renvoie l'indice d'une occurrence de la valeur maximale. """ k = 0 for j in range(1, len(tab)): k = indice_du_max_bin(tab, k, j) return k if __name__ == '__main__': from random import randint L = [ randint(1,10) for _ in range(randint(1,20))] print(L) k = indice_du_max_tableau(L) print(f"L[{k}] = {L[k]}") |
Exercice 3☘
En vous inspirant de l'exercice précédent, écrire une fonction qui renvoie l'indice d'une occurrence du maximum dans la liste donnée en paramètre. Contrairement aux versions précédentes qui renvoyaient toujours soit la première occurrence, soit la dernière, lorsque le maximum est présent plusieurs fois, l'occurrence renvoyée pourra être ici quelconque (pour une même liste, deux exécutions de la fonction ne donneront pas nécessairement la même occurrence).
Note
Pour simuler le hasard, on rappelle l'existence du module random.
Un code possible
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | from random import randint def indice_du_max_bin(t, i, j): """ t est une liste, non vide, d'éléments comparables. i et j sont deux indices de t. La fonction renvoie i si t[i] > t[j] et renvoie j sinon. """ if t[i] > t[j]: return i else: return j def indice_du_max_tableau(tab): """ tab est une liste, non vide, d'éléments comparables. La fonction renvoie l'indice d'une occurrence de la valeur maximale. """ k = 0 for j in range(1, len(tab)): if randint(0,1) == 0: k = indice_du_max_bin(tab, k, j) else: k = indice_du_max_bin(tab, j, k) return k if __name__ == '__main__': L = [ 3, 4, 3, 4, 4, 3, 4, 3, 4 ] print(L) k = indice_du_max_tableau(L) print(f"L[{k}] = {L[k]}") |
Autre version:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | from random import randint def indice_du_max_bin(t, i, j): """ t est une liste, non vide, d'éléments comparables. i et j sont deux indices de t. La fonction renvoie i si t[i] >= t[j] et renvoie j sinon. """ if randint(0,1) == 0: if t[i] >= t[j]: return i else: return j else: if t[i] > t[j]: return i else: return j def indice_du_max_tableau(tab): """ tab est une liste, non vide, d'éléments comparables. La fonction renvoie l'indice d'une occurrence de la valeur maximale. """ k = 0 for j in range(1, len(tab)): k = indice_du_max_bin(tab, j, k) return k # test if __name__ == '__main__': L = [ 3, 4, 3, 4, 4, 3, 4, 3, 4 ] print(L) k = indice_du_max_tableau(L) print(f"L[{k}] = {L[k]}") |