Algorithmes récursifs et listes chaînées
Liste chaînée¶
On rappelle le code de la classe Maillon :
1 2 3 4 5 6 | |
-
On suppose que les deux objets
m1etm2de typeMaillonont été définis, soit avec premier code, soit avec le second code.Premier code.
1 2 3
m1 = Maillon(1, None) m2 = Maillon(2, m1) m1 = Maillon(1, m2)Deuxième code.
1 2 3
m1 = Maillon(1, None) m2 = Maillon(2, m1) m1.suivant = m2On donne l'affichage réalisé par les instructions suivantes.
1 2 3 4
print(id(m1)) print(id(m1.suivant)) print(id(m2)) print(id(m2.suivant))140655316784640 140655306819856 140655306819856 140655316784640En déduire quel code a été utilisé pour définir les maillons
m1etm2. Appuyer votre réponse sur un schéma explicatif.Il s'agit d'une question de cours.
-
Écrire une fonction
supprime_finqui étant donné un maillonmd'une liste chaînée supprime le dernier maillon de cette chaîne, en en renvoyant la valeur. On parcourera toute la chaîne à l'aide d'une boucle en s'arrêtant à l'avant-avant dernier maillon. On supposera pour cela quemest le premier maillon d'une chaîne constituée d'au moins deux éléments. Les maillons de la chaîne pourront être modifiés.1 2 3 4 5 6 7 8 9
def supprime_fin(m): """ Maillon -> int Supprime le dernier maillon de la chaine, en renvoie la valeur """ maillon_courant = m while maillon_courant.suivant.suivant != None: maillon_courant = maillon_courant.suivant v = maillon_courant.suivant.valeur maillon_courant.suivant = None return v1 2 3 4 5
m = Maillon(1, Maillon(2, Maillon(3, None))) v = supprime_fin(m) print(v) print(m.suivant.valeur) print(m.suivant.suivant)3 2 None
Algorithme récursif¶
Cet exercice porte sur le type Liste définit en tp. Vous répondrez aux questions
suivantes en n’utilisant que les fonctions est_vide, creer_vide, ajoute, tete, queue.
-
On souhaite écrire une fonction
identiquesqui prend comme arguments deux listesl1etl2et qui renvoieTruesi les deux listes sont constituées des mêmes éléments, dans le même ordre,Falsesinon.-
Compléter le tableau ci-dessous. On représentera une liste par la liste de ses éléments entre parenthèses, sans se soucier de l’implémentation du type
Liste. Ainsi la liste dont le premier élément est 1 et le second élément est 2 sera représentée par(1, 2).l1l2identiques(l1, l2)()()True(1)()False()(3)False(2, 7, 8)(2, 8, 7)False(2, 7, 8)(2, 7, 8)True(3, 7, 8)(5, 7, 8)False -
Compléter le code de la fonction
identiquesci-dessous afin qu'elle réponde aux conditions de l'énoncé.2. Si1 2 3 4 5 6 7 8 9 10 11 12
def identiques(l1, l2): """ Liste, Liste -> bool Détermine si les deux listes sont constituées des mêmes éléments, dans le même ordre """ if est_vide(l1) and est_vide(l2): return True elif est_vide(l1): return False elif est_vide(l2): return False else: avant = est_vide(queue(l1), queue(l2)) return avant and tete(l1) == tete(l2)lest une liste, alors la listel"renversée" est la liste constituée des éléments delrangés dans le sens inverse. Ainsi, silest la liste(2, 4, 6)la listel"renversée" est la liste(6, 4, 2).
On souhaite écrire une fonction
concatener_inversequi étant donné deux listesl1etl2concatène la listel1"renversée" avec la listel2.-
Compléter le tableau ci-dessous.
l1l2concatener_inverse(l1, l2)(2, 4, 6)(3, 5, 7)(6, 4, 2, 3, 5, 7)()()()()(1)(1)()(1, 2)(1, 2)(1, 2)(3, 4)(2, 1, 3, 4)(1, 5, 9, 13)(7, 4, 3)(13, 9, 5, 1, 7, 4, 3) -
Écrire le code d'une fonction python
concatener_inverse, récursive, qui réponde aux conditions de l'énoncé.On remarquera que lorsque
l1 = (2, 4, 6)etl2 = (3, 5, 7), on peut obtenir la liste(6, 4, 2, 3, 5, 7)en concaténant la listel1prime = (4, 6)"renversée" avec la listel2prime = (2, 3, 5, 7).1 2 3 4 5 6 7 8
def concatener_inverse(l1, l2): """ Liste, Liste -> Liste Concatène la liste l1 "renversée" avec la liste l2 """ if est_vide(l1): return l2 else: l2prime = ajoute(l2, tete(l1)) return concatener_inverse(queue(l1), l2prime)
-