Les listes⚓︎
Les fonctions de base⚓︎
Le retour des listes chaînées
Puisque le paradigme fonctionnel est particulièrement adapté à la récursivité, nous allons utiliser les listes chaînées de la forme (tete, queue)
pour les exercices suivants.
Dans tous les exercices, vous pourrez utiliser les fonctions suivantes :
nil = None
cons = lambda t, q: (t, q)
est_vide = lambda liste: liste is None
tete = lambda liste: liste[0]
queue = lambda liste: liste[1]
>>> est_vide(cons(2, cons(4, nil)))
False
>>> tete(cons(2, cons(4, nil)))
2
>>> queue(cons(2, cons(4, nil)))
(4, None)
>>> est_vide(nil)
True
Exercice 4 : longueur(liste)
Écrire le code de la fonction longueur
qui prend en paramètre une liste liste
et qui renvoie la longueur, c'est-à-dire le nombre d'éléments qu'il contient. La liste vide a une longueur de 0.
>>> longueur(cons(5, cons(3, cons(2, cons(6, nil)))))
4
>>> longueur(nil)
0
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Exercice 5 : contient(liste, v)
Écrire le code de la fonction contient
qui prend en paramètres une liste liste
et un élément v
, et qui renvoie un booléen indiquant si v
appartient à liste
ou pas.
>>> contient(nil, 4)
False
>>> contient(cons(3, nil), 4)
False
>>> contient(cons(3, nil), 3)
True
>>> contient(cons(7, cons(2, cons(8, cons(2, nil)))), 8)
True
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Exercice 6 : i_eme(liste, i)
Écrire le code de la fonction i_eme
qui prend en paramètres une liste liste
et un entier i
, et qui renvoie l'élément d'indice i
dans liste
. On suppose que i
est inférieur à la longueur de liste
.
Indications
- L'élement d'indice 0 est la tête de la liste.
- L'élément d'indice 3 d'une liste et l'élément d'indice 2 de la queue de la liste.
>>> i_eme(cons(5, cons(2, cons(-1, cons(3, nil)))), 0)
5
>>> i_eme(cons(5, cons(2, cons(-1, cons(3, nil)))), 1)
2
>>> i_eme(cons(5, cons(2, cons(-1, cons(3, nil)))), 2)
-1
>>> i_eme(cons(5, cons(2, cons(-1, cons(3, nil)))), 3)
3
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Exercice 7 : maximum(liste)
Écrire le code de la fonction maximum
qui prend en paramètre une liste liste
non vide et qui renvoie le plus grand élément de liste
.
On pourra utiliser la fonction max
pour déterminer le maximum de deux éléments.
Indications
Puisque la liste ne peut pas être vide, le cas de base est la liste qui ne contient qu'un seul élément.
On sait qu'une liste ne contient qu'un élément quand la queue est vide.
>>> maximum(cons(5, nil))
5
>>> maximum(cons(5, cons(9, cons(3, cons(8, nil)))))
9
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Exercice 8 : indice_et_max(liste)
Écrire le code de la fonction indice_et_max
qui prend en paramètre une liste liste
non vide et qui renvoie un couple formé de l'indice et de la valeur du plus grand élément de liste
.
Attention cette fonction est plus difficile à écrire que
maximum
.
Indications
Si le maximum a pour indice 3 dans la queue(liste)
, alors il a pour indice 4 dans liste
.
>>> indice_et_max(cons(5, nil))
(0, 5)
>>> indice_et_max(cons(5, cons(9, cons(3, cons(8, nil)))))
(1, 9)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Exercice 9 : concatene(liste1, liste2)
Écrire le code de la fonction concatene
qui prend en paramètre deux listes liste1
et liste2
, et qui renvoie une nouvelle liste contenant tous les éléments de liste1
puis ceux de liste2
dans le même ordre.
Indication
La concaténation de liste1
à liste2
c'est :
liste2
siliste1
est vide.- la tête de
liste1
mise devant la concaténation de la queue deliste1
et deliste2
.
>>> concatene(cons(3, nil), cons(7, nil))
(3, (7, None))
>>> concatene(cons(2, cons(8, nil)), cons(1, cons(9, cons(7, nil))))
(2, (8, (1, (9, (7, None)))))
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Exercice 10 : renverse(liste)
Écrire le code de la fonction renverse
qui prend en paramètre une liste liste
et qui renvoie une nouvelle liste correspondant aux éléments de liste
dans l'ordre inverse.
Vous pouvez utiliser concatene
.
>>> renverse(cons(5, cons(8, cons(6, nil))))
(6, (8, (5, None)))
>>> renverse(cons(1, cons(2, cons(3, cons(4, cons(5, cons(6, nil)))))))
(6, (5, (4, (3, (2, (1, None))))))
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)