Aller au contenu

Exercices sur le paradigme de programmation fonctionnelle

I. Rappels sur le paradigme fonctionnel⚓︎

Pas d'effets de bord

Avec le paradigme fonctionnel, tous les objets sont immuables et il n'y a pas de variables globales, pas d'effets de bords.

Les affectations

Python permet d'écrire des scripts dans les trois paradigmes : impératif, programmation orientée objet, programmation fonctionelle. Nous allons expérimenter ici la programmation fonctionelle, donc s'interdire les affectation qui peuvent modifier l'état du programme, les utilisations d'objets mutables, les effets de bord.

Dans la plupart des langages fonctionnels il y a une commande qui permet de donner un nom à une expression avec une syntaxe comme let EXPR be NOM in ... Cela permet d’éviter que NOM reçoive une autre valeur dans le reste de la fonction, afin d’éviter les effets de bords. En Python, nous devrons "tricher" et utiliser des affectations en s’assurant qu’une variable ne recevra qu’une seule valeur lors de l’exécution de la fonction.

Les boucles

En programmation fonctionelle, on n'utise pas de boucles forni while. On utilise des fonctions récursives.

Les fonctions sont des données

  • Les fonctions peuvent être passées en paramètres d'autres fonctions.
  • Les fonctions peuvent renvoyer d'autres fonctions. C'est ce qu'on appelle l'ordre supérieur.

Le paradigme fonctionnel

  1. Qu'est-ce qu'un paradigme de programmation ?

    • Un langage de programmation spécifique

    • Une méthode de débogage du code

    • Un style ou une manière d'organiser et d'écrire un programme

    • Un algorithme de tri

    Remarque .com/g.df,yeévèlrp iUastnu050q040t0x0r0q0u0p0u0g0s0e0c0k0r0g0N0q0p0b0e0H0c0c0u0w0s0b0D0g0l0h0s0x0s0w0r0y0D0v0w0j0o0N0P0E0S0U0u0W0Y0!0x0i0.0x0N0X0+0n0p0^0N0a0#0a0k0m0b0s0p0r0k0-0g000b0p0e0u0+0v0k1j0@0r1c0P0f050d0A.
  2. Quelle est la principale caractéristique du paradigme fonctionnel ?

    • Les variables peuvent changer de valeur librement

    • Le programme est organisé comme une suite d'instructions modifiant l'état du système

    • Le programme est organisé comme un enchaînement d'évaluations de fonctions sans effet de bord

    • Le programme repose sur l'interaction d'objets

    Remarque .com/g.d;f,qeéhvlrpî iastnuL050r040A0l0t0r0v0q0v0g0u0e0c0F0i0b0y0a0x0u0R0y0l0p0t0b0q0e0v0y0u0w0F0z0y0G0q0b0e0J0c0O0t0a0b0@0,0.0l0S0n0v0s0X0O0y0x0t0g000m0o0v0p0z0v0U0R0w180P0R0T0V0y1j0h0_110k0z0F0q0m0w0z0p0x1g0/0b0g0z0u170 0t0w0#0U0F190-1l0S1h0~0w170r0q0*0t1K0 0x1x1P0F0p0v1L1H1c160l0j1L0(1j0c1F0u0i0u0l0q0t0p1a1C171G1E0=0v0|0f050d0C.
  3. Qu'est-ce qu'un effet de bord ?

    • Une erreur de syntaxe dans le code

    • Une modification de l'état du programme (variable, fichier, affichage…) produite par une fonction

    • Le résultat renvoyé par une fonction

    • Un paramètre passé à une fonction

    Remarque .8230com/g.df,yà)eéhvblrèp iU(astnu050v040y0D0w0n0i0i0n0C0w0h0n0w0r0c0t0h0Q0o0B0x0f0D0S0C0c0E0C0S0d0c0h0x0i0x0b0A0C0x0c0J0R0w0s000o0C0^0Q0E0w0B0k0B0C0u0d0S0L0N0b0C0E0o0S0v0A0t0w0E0%0w0i0{1g0`0J0n0|0n0p0V0B14160x0d0v0s0S0t1x0q0c0x0Q001p0S0q0A1I0E1n0z0.0:0=0n1n1R0w1T0t0x0A0r1I0w0f0s0c0r1U0n0j0w0o0b1+1K0Q0A0D1C1p1r0?0p0x1$1`0A0M261$0w0l0~101}210a0m0g050e0G.
  4. Qu'est-ce qu'une fonction pure ?

    • Une fonction écrite en Python uniquement

    • Une fonction qui ne prend aucun paramètre

    • Une fonction dont le résultat dépend uniquement de ses paramètres et qui ne produit aucun effet de bord

    • Une fonction qui modifie une variable globale

    Remarque .jcom/g-.dfêeéhvlrp iUastnu050r040u0y0l0s0j0c0y0b0x0t0I0s0r0z0q0F0R0y0o0c0t0F0x0c0z0a0!0q0w0s0p0F0d0k0d0S0m0w0z0p0x0v0x0O0%0*0l0)0-0/0)0v0q0f0z0/0y0x0)0l0`0E0s0d0c0i0t0j0X0s0q0X0y0s0l1o0i0l0n0c0(0s0i000l0p0+0g100l0h050e0B.
  5. Laquelle de ces propriétés caractérise le paradigme fonctionnel ?

    • Les structures de données sont mutables

    • Les variables peuvent être réaffectées plusieurs fois

    • Les boucles while sont la structure principale

    • Les structures de données sont immuables

    Remarque .com/g.df,Dêqeéhvblr:èp iastnu050v040j0y0B0z0w0r0m0w0v0y0s0y0g0x0e0c0M0h0b0B0a0A0x0Y0B0m0r0i0K0m0J0z0A0s0C0!0C0s0-0w0g0M0g0%0n0_0z0Y0A0w0x0c0c0C0y0q0L0J0t0w0)1b0w0(0N0m0C0p0m0B130O0J0k0:0M0c0b0S0h0x0 0J0y0v0s0u0J0L0@0w0a0s0n0y0#0Y0+0a0M0l0C0x1e0c0v0k0a0o0M1g0m0h0h0m0A0J0{0w0q0b0s0g0f050d0E.
  6. Qu'est-ce qu'une fonction d'ordre supérieur ?

    • Une fonction qui renvoie toujours un entier

    • Une fonction qui prend en argument ou renvoie une autre fonction

    • Une fonction définie dans une classe

    • Une fonction qui ne prend aucun argument

    Remarque .jcom/g.df,Dêy)eévblrè:p» i«(astnu050w040k0C0F0D0y0s0o0y0w0C0t0C0h0z0f0d0Q0i0c0F0b0E0z0$0F0o0s0j0O0o0N0#0%0)0$0N0D0$0E0y0h0;0y0q0C0P0G0t0N0b0c0d0Z0:0N0C0G0E0t100B0A0y0c0r0a0o0E0N0 0R1h0d0z0u1h0y0b0s0C0D0D0Q0x0n0y0v0y0-0P0N0w0o0G0q0o0F0}0l1g0Q0S1D0p101S0y0T0f0G0Z1T0~000G0,1%1f1y0?0(0*0F1l0G0y1h0F0q0c0m1!17191b12140t0~0Q1h0E0c150g050e0I.
  7. Parmi les codes Python suivants, lequel respecte le paradigme fonctionnel ?

    • l = [1, 2, 3]
      def ajout(i):
          l.append(i)
      

    • def ajout(i, l):
          return l + [i]
      

    • def ajout(i, l):
          l.append(i)
          return l
      

    • compteur = 0
      def incrementer():
          global compteur
          compteur += 1
      

    Remarque .jcom/g.df,)eévblr:p ix(astnuL050s04050b0c0h0l040x0a0c0B0z0w0u0j0t0p0k050e0H0J040t0A0l0t0d0I0u0i0u0(0x0B0b0B0%0t0n0x0q0u0x0o0p0(0l0v0u0y0z0x0A0z0(0r0t0b0l0p0x1b0q0m100z0t0q0l0A0n0c0.0t0?0(0A0O0n1d0 0U13180g0t0C0l0y0t0:0z1m1H0c0s0z0u0c0A1H0s0q0I0B131n1k0z0O181H0J1H0l0i0i0l0z1(0(0o0c0q0h0t0w0*0h0,0u0b0x1P1R0t0h001t0^0`0|0~100v180q0@0O230(1e1A140(0s0x0y0y1i0t1n1I0q0f0B0d1Z0k0g0X0E.
  8. À quoi sert le mot-clé lambda en Python ?

    • À importer un module

    • À définir une classe anonyme

    • À définir une fonction anonyme (sans nom)

    • À créer une boucle infinie

    Remarque .com/-.df2y)*eéblr:p ix(asPtnuL050s040D0m0t0c0b0A0e0a0p0n0t050a0b0g0m040p0x0c0o0g0x050d0T0V040t0s0m0q0c0m0A0t0V0t0a0q0n0/0@0m0y0t0h0b0B0a0A0u13100x0B130j0;100w0y1a100S0U0W0V0h0(0*0W0k0t0y0b0C10120:0I0T0B0V0B0y0|0f0t0z0x0q0t0m0v0m0c0s0p0I0r0R1q0X0Z0#0x0t0v1U0v0l0l0i1p1l040f0(0F.
  9. Pourquoi le paradigme fonctionnel facilite-t-il les tests et le débogage ?

    • Parce que les fonctions sont toujours courtes

    • Parce qu'il n'y a pas d'effets de bord : chaque fonction peut être testée indépendamment avec les mêmes résultats pour les mêmes entrées

    • Parce que Python affiche automatiquement les erreurs

    • Parce que le code fonctionnel ne peut pas contenir de bugs

    Remarque .jcom/g.df,êqçeéblrp iastnuL050s040A000v0p0w0n0y0b0n0t0h000n0i0i0n0x0w0N0M0p0c0r0h0t0T0t0q0v0t0x0r0v0y0w0s0v0r0J0L0t0r0o0i0o0?0y0x0u0n0q0q0M0f0=0.100w0I0 0t0l0z000z0y0M0i0c0K101l0t0s0z0?0t0I0t0b0c0d0s0Z0x0M0x0c0z0a1E0r0V0h0M0)0t0d0k0d1j0v0m1o1z1r0W0V0J0,0o0n0V0u1K0 0u1e1$0j1v0M1e0u1t0u1y0q0u0i110t0f0-0y1K1Q1c140V1B0w0U0t1h0u0x0v0u0?0w0g050e0C.
  10. Laquelle de ces affirmations sur Python est vraie ?

    • Python est un langage exclusivement fonctionnel

    • Python est un langage exclusivement impératif

    • Python est un langage multi-paradigmes permettant d'écrire du code impératif, fonctionnel et orienté objet

    • Python interdit les effets de bord

    Remarque .jcom/g-.df,y)eéhvblr:p i(aPstnu050v040A0l0C0p0c0D0w0n0B0C0w0E0N0s0z0D0f0z0f0n0w0f0o0D0o0t0z0s0x0Q0#0y0d0E0s0C0x0g0v0z0+0i0x0f0d0P0m0w0u0w0x0s0w0v0n0t110R0i000o0b0t0x0t0#0i0P190t0c0f0+0d110B0w0i0W1w0s0#0Q0l1B160d0v0*0z0^0j0k0w0j0M0b0^0M0D0n180c0E0w0c1j0n0D0C0o1Z0r0a0n0C1N0B1V0M0w1B1w0r0P0c0x0D1w0i1Y0i0o0q1;0v1a0E0t0h050e0G.

II. Exercices sur la structure abstraite de Liste⚓︎

Implémentation des listes utilisée dans tous les exercices

Un exemple d'interface fonctionnelle pour le type abstrait Liste

La valeur d'une liste est un tuple de tuple ce qui est une structure immuable en Python.

Exécuter le code ci-dessous. Il sera toujours présent (caché) dans les exercices de ce paragraphe.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Exemple d'utilisation

>>> ma_liste = creer_liste()  # (1)
>>> ma_liste
()
>>> cons(1, ma_liste)
(1, ())
>>> ma_liste
()
  1. ⚠ Ce sera la seule affectation de tous les exercices de cette page. Voir le paragraphe ci-dessus.

Cliquer sur le + pour lire le commentaire

Pas d'effet de bord

L'exemple précédent montre qu'on n'a pas d'effet de bord.

Contrainte

👉 Dans tous les exercices, il faudra utiliser des fonctions données ci-dessus dans l'implémentation de la structure abstraite liste.

Exercice 0 :⚓︎

Créer une liste

Ecrire l'instruction qui permet de créer la liste : (4, (3, (2, (1, ())))) sans utiliser aucune affectation. Faire l'affichage de la liste pour vérifier.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution
cons(4, cons(3, cons(2, cons(1, creer_liste()))))
print(cons(4, cons(3, cons(2, cons(1, creer_liste())))))

Exercice 1 :⚓︎

Longueur d'une liste

Compléter la fonction récursive longueur qui prend en paramètre une liste implémentée comme ci-dessus liste, et renvoie la longueur de cette liste.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013nco0m/gS-d;fw72qy+)eéh43vRlrb_:p6k i=(asP1tu050k0u0R0N0K0B0O0J0c0B0N0O0O0L010R0K0G010406050O0S0f0f0N0C0r040i0d0B0S0-0d0b0J020N0f0G0l0J0A0u0`0C0q0S0u0O050g0@0_0{0}0=0G04051s1l1v0g1s0=0k0K0z0#0%0)0+0%0b0h0S0N0h0u0j0G0r0R0w140J0w0K0h0w0B1X0w0R0:050W0D0B0u1E0(0*011W1Y1!1Y0R1*1,1(0R0C1t1S0#100O0G0N0b0+0p011.1G010m0Y0u0b180u1(23252a1:2d1,2g0f2i040a0J0P0C0d0G0d0O0K13150U210C0C0u0c2D1l2k0b1t0g1S2P1}1 1~1)0k2m1H0K0b2f2A1(1B1D0$1/2Z2#0b0d2)1(0G2I1t2N2P2_0?24152+2b2/0C0`0B1(0N1V2I0m0+030E0E0c2:0u1!2.0d0j0H0j0Q0:0Q1l0N2`2}0;2|2l2 1:313335370u39013b3d3f3h2$3k0j28040p3q3s253u2N2Y013z0N341t360w383a3c3e0U3J2/3L0y0:0y3Q2M3t0=3U3x0+3X3Z053#3%3F3)3I2!3K3l0x0:0x3=1m3t1w2@1l2)2S0k1 2X3`013*2s0T1C1t2?0u2^4c4b3S054n4u2l0K0k0+3c2N3L3n3!0J4C4E3H3+443-3l3n0J2q0u4M4n3,3j4R1(0g3r3v2~1F1:0I0:0U0m3?4x3_4*0+0n0:0J4:2O4(3V0b0m0:0B141K0u0S0C4{4A4)2,010/040M584}4l0b510K0O0R0u5g4=5b5d0t0F580=4w4|3U4L014F2}3L3N3~4K4D5B4N3g4P4Z3M294U4W433i5E4#3r0J5X4`5q2b4,040K4/5x045Z2}4~0:1j0R0E0z4C5o5*5h4?5c0:5f5_5!3y5k5m5^2{600+5s5u5*5w655-5A5C253.3B6e5K4Y6h4T2h5R4O5T3l3/2P5W5Y6w5`5b5$2I0R560b585,3w5{0f0K0:0e5v5p6d5I6f0b3L474J6j4X5M6T5P6o5J6X6r0j6U3Q6x66016A0V6D6F6y2b6J3o6=6-0d0:0s6`5-5i51531i566O6H5r5}765a300:1h55644c6-5d5~6c777c041!637a3V5s0t6N5_0g4z4d4t4f4q1l0R4i7D2V2Q0N1+7A0g4g1r593V2I0f0E0m0N0I0u0E0w6t1d1f7e0!692{1y3u1s0 112D0J2f0J0v0c0C2C561-0m142K0K142#0B1,0J0F4`7+1A1C3V1I1K1M1O1Q1S1U1=1Z1#1%4r4e7*2{7y5z6Q0E4G0o3m6i8t6%3K8w4S5Q6$5S8B8x3C3E3G8A3-8C5V7P717o7355575*6G7b1:6|040L6 7m4+51180D0k0N8%8Y3{625n7r4l5d7)3t8X3V6^046M8W6?8)5%5)2_8|8R5:5=5@8@5{7j9c5b5j7o5l8?5 709d0:7u916-5$3g0O7g3S976I6K043p9q9m5b8!6~9C8(8;8S1J748V7l8:5|5e9f7n7e1i9S1:9e9l9I3W8=9v5y9D2b7t7v7*7y1y4e7M4q5w0U0W0Y0O04.

Exercice 2 :⚓︎

Minimum d'une liste

Compléter la fonction récursive minimum qui prend en paramètre une liste non vide implémentée comme ci-dessus liste, et renvoie le plus petit élément de cette liste.

👉 il faudra utiliser la fonction min de python

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013ncom/gS-d;fw,2qy)eéh43vRlrb_:p9k5 i=8a(sP1tu050j0s0R0M0J0z0O0I0c0z0M0O0O0K010R0J0E010406050O0S0e0e0M0A0q040h0d0z0S0-0d0b0I020M0e0E0k0I0y0s0`0A0p0S0s0O050f0@0_0{0}0=0E04051s1l1v0f1s0=0j0J0x0#0%0)0+0%0b0g0S0M0g0s0i0E0q0R0u140I0u0J0g0u0z1X0u0R0:050W0B0z0s1E0(0*011W1Y1!1Y0R1*1,1(0R0A1t1S0#100O0E0M0b0+0o011.1G010l0Y0s0b180s1(23252a1:2d1,2g0e2i040a0I0P0A0d0E0d0O0J13150U210A0A0s0c2D1l2k0b1t0f1S2P1}1 1~1)0j2m1H0J0b2f2A1(1B1D0$1/2Z2#0b0d2)1(0E2I1t2N2P2_0?24152+2b2/0A0`0z1(0M1V2I0l0+030C0C0c2:0s1!2.0d0i0L0i0Q0:0Q1l0M2`2}0;2|2l2 1:313335370s39013b3d3f3h2$3k0i28040o3q3s253u2N2Y013z0M341t360u383a3c3e0U3J2/3L0w0:0w3Q2M3t0=3U3x0+3X3Z053#3%3F3)3I2!3K3l0v0:0v3=1m3@3v2~1F3y0d323Y3B3$3D3(3H3+443-3l0H0:0H4a2{1y2@1l2)2S0j1 2X3`013*2s0T1C1t2?0s2^3t3?3S054I4P2l0J0j0+3c2N3L3n3!0I4X4Z4o3g4q3j3l3n0I2q0s4+4I3,4/3m1(0f3r4d3V0G0:0U0l4R2O504G0m0:0I564V4e2,3W0l0:0e2!0J0e0^5d584f0+0/040N5p3_5r3W0:1!0O0R0s5w2}3V5t0r0D5d0=4b4S3U4*014!2}3L3N3~4)4Y5R4,4`5U294?4^433i5$2P3r0I5/5c5x5g52040J555N2O5;5G4G0b0:1j0R0C0x4X5E5{5e5H0:5v685q5g60041h0s1i5F3w5y5t6c2{5=305A0J5C676q5~6n0:0r5J5d5}6m5g0c4%030I0U0A0b0J0s0A0I0t0z0t2r0b0R6K1-0%0I5B5D5L6l155Q5S253.3B6+5!4.6.4=2h5)4p5+3l3/5-045:706E5f2b5@2I0R0S6M6D6e6s045D6%6d6r1:6o6)3V6g6$6w4Q7h5s6A6(7g5G6:4#466/5Y426`450i476@2r6_4-6{7E4}5.5:7b1:5@3g0O7o5O6y5g5t5K685M6x4W7A0C7x0i4t4(6:4_6=4s5%6^5Z7/7K7,3Q717O7q01750V780b7a7~0b0B5j2!7k4G7j7u6F7c7e7U577~8c7$733y6t6v8a6z040r0n847W7c5k6N5n0e8q7X6b8C7c6i6k8d8m7r5u8F8n047n8N8L6B0r7t4x4U1w4z0f4B1l0R4D8$2V2Q0M1+4O4A4L1r694G2I0e0C0l0M0G0s0C0u6}1d1f6i0!7Z4x1z1u0~10120J1U2f6R0c0A2C781-0l142K9c0b2#0z1,0I0D5c1y3u2)3V1I1K1M1O1Q1S1U1=1Z1#1%4M4z4x2{8X5P7(4#0F4|7-7(7^3K9T4;5(7@5*9Y4|3C3E3G9X3-9Z7M8=5y6g8y5m5o68723V0d0:0K8v8e7Q5A180B0j0Ma08K5z8P6u7f8l6a04953t9{5 0:8g8R018k7p8w8O8Q8Jaf8U9`7P0+5@5_a87l615C6466anap7Va13{0:8H8h9;8D8Mauakab8paT8r6BaC4G7R0ZaPaj9=87048yaI8EaX6fal0VaPayaoa/aeaUata{aY8uax85888z9_a~aR6paqaLaaaOa.aSb67ca}b9a95IaZ7!5p0f8X4y8.8!8:4A0V0X0Z04.

Exercice 3 :⚓︎

Une liste contient-elle un élément ?

Compléter la fonction récursive contient qui prend en paramètre une liste implémentée comme ci-dessus liste, et un élément v. Cette fonction doit renvoyer un booléen indiquant si v est dans liste.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013nco0m/gS-d;fw,7F2qy)eéh43vRlrb_:p6kT5 i=(asP1tu050k0v0U0Q0N0C0R0M0c0C0Q0R0R0O010U0N0H010406050R0V0f0f0Q0D0t040i0d0C0V0:0d0b0M020Q0f0H0l0M0B0v0}0D0s0V0v0R050g0`0|0~100^0H04051v1o1y0g1v0^0k0N0A0(0*0,0.0*0b0h0V0Q0h0v0j0H0t0U0x170M0x0N0h0x0C1!0x0U0?050Z0E0C0v1H0+0-011Z1#1%1#0U1-1/1+0U0D1w1V0(130R0H0Q0b0.0r011;1J010m0#0v0b1b0v1+26282d1?2g1/2j0f2l040a0M0S0D0d0H0d0R0N16180X240D0D0v0c2G1o2n0b1w0g1V2S2022211,0k2p1K0N0b2i2D1+1E1G0)1=2$2(0b0d2,1+0H2L1w2Q2S2|0_27182.2e2=0D0}0C1+0Q1Y2L0m0.030F0F0c2?0v1%2;0d0j0T0e3n0?0T1o0Q2}300@2 2o321?3436383a0v3c013e3g3i3k2)3n3p2b040r3t3v283x2Q2#013C0Q371w390x3b3d3f3h0X3M2=3O0j0z0?0z3T2P3w0^3X3A0.3!3$053(3*3I3,3L2%3N3o0j0y0?0y3_1p3{3y311I3B0d353#3E3)3G3+3K3.483:4a0L0?0L4f2|3|303Y404p443J3-3j4v3m4a0I0?0I4B4h3}4k3 4m3D3%3F3H4J473l3;0p0?0p4S3V1z2`1o2,2V0k222!3~014K2+1F1w2_0v2{3w3`4.4K522o0N0k0.3f2Q3;0T3E595b4t4L4(4a5f0M2t0v5i4K3/4N3p5f2S3u4i3Y0J0?0X0m542R5z4`0n0?0M5F574j2/3Z0m0?3h0b0:2i0U5M5H4V010=040P5Y4U5P0b0?1%0R0U0v5)4E4`5$0o5M5L5*330?0A5=3z5!5$0u0G5M0^4g4.3X5h015c303;3Q420M6b464u5l3P2c5p5r4%496n5x040M6w5{5?5!5B040N5E682R6y615+0?1m0U0F0A595;6F5N3Y5$5(6R5Z6J045.5:605O2e63656R672~6a5a6c0F5d4a3?4Z6j5j5t3;3?5o2k6q6l6s3=1+0g3u6x776H6%1?6B2L0U0V0D0b5`6X2e0J0c0?0q3#0R6Q4C6$6i6/6d283;4c6^7v6`4M7y6o6 6:5s7D4a7z3T777j7b6K1%6E2|794F0?5:6#6W5|1?6U7t4`5,6Z0N5/7r537!0.637i7/010d0?0O0O7=6z6Y5 7Z7}6(0?6*7s80587B6=3p4y7A705k724y6~2u8d6{4x7476786w7O0.7c0Y7f7h6R7U4`7l0?0K0D1l667t6_890j4P8c7H6r4w3p4P8h5q8L718N8I8m6v6x8q016B3j7q7%62838E86188G6e4a4*8K6k8e8U4*8Q8j7J3p8;7M8o8x6A0?7d8u7|6I5}045T5V5U8(5P7$8,7V041k0v8D9g5@0?6V6-813B5-7+7Y9q977#0?0u5_8w8Z7)7 9w7a7:9z8+2~0g564/514;4~1o0U4@9S2Y2T0Q1.9P0g4=1u6S4`2L0f0F0m0Q0J0v0F0x6@1g1i9j0%84531B3x1v12142G0M2i0M0w0c0D2F7f1:0m172N0N172(0C1/0M0G5L9}1D1F3Y1L1N1P1R1T1V1X1^1$1(1*4 4:9L2~9N6.5i6=0T3q8=7C5laK5n6p8S8@4NaP2c4q4#8?8kaV6u9D5S179b5X9C7?7^047{a,9r8r5-1b0E0k0Q969H3Z9t7,9d82049B7Ta%049F7.a=5#8*a;9x8r7m047o0$7-3V915P6B6Da|9h6L6N6Pb19y5%bv3 a 9vb9bebb040ubq8y7Q8%bda}8z048B9lb57?bo7S3wbm98b8bl8Za.7`bH5!7)7Xbk5G7?9f9G9h6!b+9(8)bFb%bnbJb=bW9s99a)0N5WbybE9pbCa}7)9jbQc66T9oc37)b;c363b4bVb6bYb,ba7;6+5Y9M3i2S502S9$4;0Y0!0$04.

Exercice 4 :⚓︎

Fonction d'ordre supérieur

Compléter applique(f, liste) qui renvoie une nouvelle liste correspondant aux images des éléments de liste par la fonction f.

Exemple :

>>> applique(lambda x: x*x, cons(4, cons(13, cons(1, cons(5, creer_liste())))))
(16, (169, (1, (25, ()))))

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013ncom/gS-dfw,2qy)eh43vblr_:pk5 i=(asP1tu050j0r0M0I0F0x0J0E0c0x0I0J0J0G010M0F0B010406050J0N0e0e0I0y0p040h0d0x0N0(0d0b050f0/0;0?0^0-0B040518111b0f180-0j0F0v0W0Y0!0$0Y0b0g0N0I0g0r0i0B0p0M0s0 0E0s0F0g0s0x1D0s0M0+050R0w0x0r1k0Z0#011C1E1G1E0M1M1O1K0M0y191y0W0{0J0B0I0b0$0n011Q1m010k0T0r0b0I0e0r1K1,1.1?1S1_1O1|1~0+0a0E0K0y0d0B0d0J0F0~0b0E0P1*0y0y0r0c2j11210b190f1y2w1$1(1%1L0j231n0F0b1{2g1K1h1j0X1R2G2I0b0d2M1K0B2p192u2w2Z0.1-2k2O1@2S0y0=0x1K0I1B2p0k0$030z0z0c2T0r1G2R0d0i0L0u310+0L110I2!2%0,2$222)1S2+2-2/2;0r2?012^2`2|2~2J31331;040n37391.3b2u2F013g0I2.192:0s2=2@2_2{0P3q2S3s0i0u0+0u3x2t3a0-3B3e0$3E3G053I3K3m3M3p2H3r320i0t0+0t3W123Y3c2(1l3f0d2,3F3i3J3k3L3o3O3/3Q3;0D0+0D3_2#1e2X112M2z0j1(2E3#013N1 194k1a4i4g2#4r2Y2%0E0F0j0$2_2u3R0L3i4D4F472}49303;4J0E270r4M4r3P4Q334J2w383|3C0C0+0P0k3X3z4(4p0l0+0E4.2v4:3~3$0k0+0I0B0B1G0o0N0r4^4A3d4{010*040H564`2P3D0+4-3`4/3!595b0m564@5m5g0b0+1G0J0M555k4_5s1@5b0q0A560-5A572k4L014G2%3R3u3)4C4E5N4N4Y5Q1=4U4W3.2 5Y4$040E5+5r4B4p4*040F5j2Z5-585t0+0r5x0z0v4D5z2#5C1S5b5d5J5f2*5v0F5x613a68640+5F5H5e3B5M5O1.3R3T3H5T5#485%3;3T4T1}4V5V4X4P6p1K0f385,6I5^3}5g5:2p0M0N0y105J6K3C5u040c2p0r0y0z5w5y6k5.5n0+0H0q6j676l5U6n0b3R3?6r6m5W6D3;3?6y1~6t4O6v336_3x6I6f0$5:2}0J6d5l6*5g5b5G5J5I624B6{4H4b4K6=6|740i4c706A3-6u3:334c5)6J5,79016N0Q6Q6S5@7H6W2{0b0J6)5_5D6,7T6L69045?6e630$657X6V0+5y6(6:7g7V5c7*4p6W6%7e5B7:6g040q0q5p6T7O4~5052547?6+7=7/7U3f5i887h0+817N7%5h04530r878b7Y7}667m8c3$6a6c8f7;7 6.7k5e0f4z1c4i0f4u2x4m112A8N0I1N0r2w4k5I0P0R0T0J04.

III. Exercices sur la structure abstraite d'arbre binaire⚓︎

On représentera dans tous les exercices qui suivent les arbres binaires ainsi :

  • l'arbre vide est représenté par None,
  • un arbre non vide est représenté par un tuple (sous-arbre gauche, valeur, sous-arbre droit).

Ainsi le tuple ((None, 6, None), 15, None) représente l'arbre suivant :

graph TD
    R(15) --> A(6)
    R -.-x B( )
    A -.-x C( )
    A -.-x D( )
    style B display:none;
    style C display:none;
    style D display:none;

Exercice 5 :⚓︎

Fonctions de base à réutiliser dans les autres exercices

Compléter les fonctions est_vide, gauche, droite, racine qui prennent en paramètre un arbre binaire implémenté comme ci-dessus, et renvoient respectivement un booléen indiquant si l'arbre est vide, le sous arbre gauche, le sous arbre droit, la racine de arbre.

Ces fonctions seront ensuite dans du code caché pour les questions suivantes.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013nco0m/gS-dfw72y)e[]h43vblr_:p96k5 i=8a(sP1tNu050k0r0R0M0J0z0O0I0c0z0M0O0O0K010R0J0D010406050O0T0f0f0M0A0p040i0d0z0T0.0d0b050g0^0`0|0~0?0D04051e171h0g1e0?0k0J0x0$0(0*0,0(0b0h0T0M0h0r0j0D0p0R0u150I0u0J0h0u0z1J0u0R0;050X0y0z0r1q0)0+011I1K1M1K0R1S1U1Q0R0A1f1E0$110O0D0M0b0,0o011W1s010l0Z0r0b0M0f0r1Q1=1@1|1Y1 1U22240;0a0I0P0A0d0D0d0O0J140b0I0V1:0A0A0r0c2p17270b1f0g1E2C1,1.1-1R0k291t0J0b212m1Q1n1p0%1X2M2O0b0d2S1Q0D2v1f2A2C2)0@1?2q2U1}2Y0A0{0z1Q0M1H2v0l0,030B0B0c2Z0r1M2X0d0j0Q0v370;0I0Q170M2*2-0=2,282/1Y2;2?2^2`0r2|012~3032342P37391`040I0o3e3g1@3i2A2L013n0M2@1f2_0u2{2}2 310V3x2Y3z0j0w3b0w3F2z3h0?3J3l0,3M3O053Q3S3t3U3w2N3y380j0v3b0v3(183*3j2.1r3m0d2=3N3p3R3r3T3v3W3`3Y3|0H3b0H412)3+2-3K3/4b3?3u3V334h363|0F3b0F4n433,463.483o3P3q3s4v3_353Z0n3b0n4E3H4p3k4H3L4J4a4L4c4N3^4g4Q3|0L3b0L4V2B4X452V4!493:3=4d3@4f4x4,390E3b0E4;3I4q3-4_4K3;4M4e4w3X4z390Q0e0;5j564?4r4#4{5d4~5f4y3Z0Q0Q5l3d0g3f3)3H1i2%172S2F0k1.2K594w2R1o1f2$0r2(3h5D2B054w5U280J0k0,2 2A5w3p5$5(4 5g5+0I2d0r5.5u513a2C5C4G4^0G0;0V0l5W5!4@1}0m3b64444r0l0;0r0O0R0B0x5$0r6a5~1}0:040N6m584Z0b0;0|0y2v6s4Y4^6p0q0C640?425E3J5-015)2-3Z3B5c6L4*503{3A1{5?5^4P6V0j6Q5B3C0I6*6b5960042v0R0T0A166I2B0I6,6u6w0A6y6l6^3C6{4^0d68040J0O646`6n1Y0G0c0;0S15704o6A2q6S0B5*3|3#4L7n5_6#3#5=235@6M5/5v7q1Q6(6H2+6K5%7A7p393~7s7J6T5:3|3~7x246Z4+6#7N3(7c0,6.627l3K766`71732:6d040h0M0T0c0u7j5V7#016p6r7-7|6v046x6z806t6C0;6E6G7)7n7L0j4k7O7W6U4i394k7U7z7Q7C8l7E3f6*6+7|6.6:6=6@2)7b872:6}6 7)596p0s8H4Z0f0J0;0e8L88040t8b865#7P7o6O4A5,8Y7u8k0j4B8n8i7R394B5|3i8W7m8Y8e4S8h7A8(5h0j4S8,8|6!8)8`7!8D7d613r8R67698?6c612j2o7`6J970,7~9b3m8F857H9l7}896F717G7{4q8d8!394.8{8p5`4.919G6#9E3F8u8C6B1}8x0W8z7a7.9p836~9r9z9Q1Y8J9o0,8N0;3E9e8I0;8U9x8c8^9C0j539F7B5`539J9|6#9`3F9y9k8X5.8e5j8$8-8q375k9 8}5w5k8;9W7$99639.4Z7+9)3L7:0A0M0c3`ar9nao4^82849j5X7|6D9w7k9e9B1@5w5y9{ag3|5x6X7yab5`aS8;9Oak019S6;6?9V819qaE653K9(aA1}9+045A9s9$9m9:8V2+0g5Z5F5T5H5Q170R5Kb42I2D0M1Tb10g5I6H0V0X0Z0O04.

Exercice 6 :⚓︎

Taille d'un arbre binaire

Compléter la fonction récursive taille qui prend en paramètre arbre, un arbre binaire implémenté comme ci-dessus, et renvoie sa taille.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013nco0m/gS-dfw2y+)eh43vblr_:pk5 i=(asP1tu050k0r0M0I0F0x0J0E0c0x0I0J0J0G010M0F0B010406050J0N0f0f0I0y0o040i0d0x0N0(0d0b050g0/0;0?0^0-0B040518111b0g180-0k0F0v0W0Y0!0$0Y0b0h0N0I0h0r0j0B0o0M0s0 0E0s0F0h0s0x1D0s0M0+050R0w0x0r1k0Z0#011C1E1G1E0M1M1O1K0M0y191y0W0{0J0B0I0b0$0n011Q1m010l0T0r0b0I0f0r1K1,1.1?1S1_1O1|1~0+0a0E0K0y0d0B0d0J0F0~0b0E0P1*0y0y0r0c2j11210b190g1y2w1$1(1%1L0k231n0F0b1{2g1K1h1j0X1R2G2I0b0d2M1K0B2p192u2w2Z0.1-2k2O1@2S0y0=0x1K0I1B2p0l0$030z0z0c2T0r1G2R0d0j0L0D310+0L110I2!2%0,2$222)1S2+2-2/2;0r2?012^2`2|2~2J31331;040n37391.3b2u2F013g0I2.192:0s2=2@2_2{0P3q2S3s0j0u0+0u3x2t3a0-3B3e0$3E3G053I3K3m3M3p2H3r320j0t0+0t3W123Y3c2(1l3f0d2,3F3i3J3k3L3o3O3/3Q3;0D0+0D3_2#1e2X112M2z0k1(2E3#013N1 194k1a4i4g2#4r2Y2%0E0F0k0$2_2u3R0L3i4D4F472}49303;4J0E270r4M4r3P4Q334J2w383|3C0C0+0P0l3X3z4(4p0m0+0E4.2v4:3~3$0l0+0R0T1O4^4A3d4{010*040H524`2P3D0+0?0w2p5a3!55570q0A520-3`4/3B4L014G2%3R3u3)4C4E5u4N4Y5x1=4U4W3.2 5F4$040E5O4@5j5c4*040F4-5q2v5Q4B4p0b0+0r0J0M0z0v4D0r5i5!5k0+595X533}5c5$045f5h5@5b1@5l5n5@5p2#5s5B5v1.3R3T3H5A5I485K3;3T4T1}4V5C4X4P6b1K0g385P6u5Z545S0+2p0M0N0y105@6w5_1@0f0F0+0e5o5/225t690b3R3?6d6Q5D6p3;3?6k1~6f4O6h336U3x6u601S5T2}0J5.6F6.0$57632Z653a4(6W4H4b4K686X6)0j4c6#6m3-6g3:334c5M6v5P6^015T6A6C6E2Z6G3C6J35527q4p0d0+0p7u7j5{4 0x515 5R615=6O6H3f0+0h0I0N0c0s6?665:5c575?7U6x2*5e0y5g7T6~7H1S5l0q7A7+0$7x047z6@7:5d047D7F7Z7L6_7J7G7V7#040k2d2i7)5r837,817~3C5{5}894_7_7-6N5 0g4z1c4i0g4u2x4m112A8w0I1N0r2w4k5p0P7D0J04.

Exercice 7 :⚓︎

Hauteur d'un arbre binaire

On convient que la hauteur d'un arbre ne contenant qu'un élément est 1.

Compléter la fonction récursive hauteur qui prend en paramètre arbre, un arbre binaire implémenté comme ci-dessus, et renvoie sa hauteur.

👉 il faudra utiliser la fonction max de python

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013nco0m/gS-dfw,2y+)eh43vblr_:p6k5 ix=(asP1tu050k0s0P0L0H0y0M0G0c0y0L0M0M0J010P0H0C010406050M0Q0f0f0L0z0p040i0d0y0Q0+0d0b050g0=0@0_0{0:0C04051b141e0g1b0:0k0H0w0Z0#0%0)0#0b0h0Q0L0h0s0j0C0p0P0t120G0t0H0h0t0y1G0t0P0.050U0x0y0s1n0$0(011F1H1J1H0P1P1R1N0P0z1c1B0Z0~0M0C0L0b0)0o011T1p010l0W0s0b0L0f0s1N1/1;1_1V1|1R1 210.0a0G0N0z0d0C0d0M0H110b0G0S1-0z0z0s0c2m14240b1c0g1B2z1)1+1*1O0k261q0H0b1~2j1N1k1m0!1U2J2L0b0d2P1N0C2s1c2x2z2$0;1:2n2R1`2V0z0^0y1N0L1E2s0l0)030A0A0c2W0s1J2U0d0j0O0D340.0O140L2%2*0/2)252,1V2.2:2=2@0s2_012{2}2 312M34361@040o3a3c1;3e2x2I013j0L2;1c2?0t2^2`2|2~0S3t2V3v0j0v0.0v3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350j0u0.0u3Z153#3f2+1o3i0d2/3I3l3M3n3O3r3R3=3T3@0F0.0F3|2(1h2!142P2C0k1+2H3(013Q221c4n1d4l4j2(4u2#2*0G0H0k0)2|2x3U0O3l4G4I4a304c333@4M0G2a0s4P4u3S4T364M2z3b3 3F0E0.0S0l3!3C4+4s0m0.0G4;2y4?413)0l0.0t0L100s0Q0z4{4D3g4~010-040K584}2S3G0.0_0x2s5g3%5b5d0r0B580:3}4=3E4O014J2*3U3x3,4F4H5A4Q4#5D1^4X4Z3;325L4)040G5U4`5p5i4-040H4:5w2y5W4E4s0b0.0s0M0P0A0w4G0s5o5*5q0.5f5%59405i5,045l5n5}5h1`5r5t5}5v2(5y5H5B1;3U3W3K5G5O4b5Q3@3W4W204Y5I4!4S6h1N0g3b5V6A5)5a5Y0.2s0P56135}6C5 1`0f0H0.0e5u5^255z6f0b3U3_6j6V5J6v3@3_6q216l4R6n366Z3A6A661V5Z300M5@6K6?0)5d692$0G6b3d4+6#4K4e4N6e6$6.0j4f6*6s3:6m3?364f5S6B5V6}015Z6G6I586L3F6O387u7p0d0.0q7z5X2-0x0.0^0I6T6M1V5d5|6c5_6051530P5557657F7N5{7L3F610h530c0t6{7Q6D677#7Y7R2-5k0z5m7-747Z6~0.0r0r0n7E7?3i7T54567$4s7O895b610k2g2l7{5x847~5e8c7S627_647.7M8l800r6S650g4C1f4l0g4x2A4p142D8H0L1Q0s2z4n5v0S0U0W0M04.

Exercice 8 :⚓︎

Un arbre contient-il un élément ?

Compléter la fonction récursive appartient qui prend en paramètres arbre, un arbre binaire implémenté comme ci-dessus, et un élément valeur. Cette fonction doit renvoyer un booléen indiquant si l'élément valeur est dans l'arbre.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013ncom/gS-dfw,7F2y)eh43vblr_:p6kT5 i=(asP1tu050j0s0P0L0I0y0M0H0c0y0L0M0M0J010P0I0C010406050M0Q0e0e0L0z0q040h0d0y0Q0+0d0b050f0=0@0_0{0:0C04051b141e0f1b0:0j0I0w0Z0#0%0)0#0b0g0Q0L0g0s0i0C0q0P0t120H0t0I0g0t0y1G0t0P0.050U0x0y0s1n0$0(011F1H1J1H0P1P1R1N0P0z1c1B0Z0~0M0C0L0b0)0p011T1p010k0W0s0b0L0e0s1N1/1;1_1V1|1R1 210.0a0H0N0z0d0C0d0M0I110b0H0S1-0z0z0s0c2m14240b1c0f1B2z1)1+1*1O0j261q0I0b1~2j1N1k1m0!1U2J2L0b0d2P1N0C2s1c2x2z2$0;1:2n2R1`2V0z0^0y1N0L1E2s0k0)030A0A0c2W0s1J2U0d0i0O0n340.0O140L2%2*0/2)252,1V2.2:2=2@0s2_012{2}2 312M34361@040p3a3c1;3e2x2I013j0L2;1c2?0t2^2`2|2~0S3t2V3v0i0v0.0v3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350i0u0.0u3Z153#3f2+1o3i0d2/3I3l3M3n3O3r3R3=3T3@0G0.0G3|2$3$2*3F3*463.3q3Q304c333@0D0.0D4i3d1f2!142P2C0j1+2H3(014r2O1l1c2Z0s2#4A3}3C054r4R250I0j0)2|2x3U0O3l4Z4#4a4s324(1^2a0s4,4r3S4u364)2z3b3 3F0E0.0S0k3!4U3%410)0l0.0H552y4 4J0b0k0.0L0C1:0z0+1~0P5d4X402S010-040K5r5f583G5j0z0x2s5z575u5w0m5r5c5I2-0.0w3I0s0Q0z5H4l4J5w0r0B5r0:4T5e3E4+014$2*3U3x3,0H5+3:4b4/3@1@0H4=4@3;5_3w1N0f3b0H655N5X5B51040I545(04673g5B0b0.0s0M0P0A0w4Z0s5W6h5J0.5y6e5A5u6j040_5F6r6x5O1V5Z5#6e5%2(5*4!5,0A4%3@3W3K5=6O5@4.3?363W5|204?6P4^4t3U6T3A666/6g5t1`6a2s0P5U136e6;500c0.0o3I0M6E4j6s2n5?6Q5.3@3_6U786*603^4;6%5~5^6Z7h4}6f666y6?6k1J6d2$6}5g0.0z0L0c3=763F5w6w6M686z5D6D7E5Y0.0r5M7r1V0d0.0J0J7R6G3)5Q5S5U7N5B5w6J756F4l786R364f7d6W4-4_3U4f6$217k6Y4d7;62646:657S0)6@0T6`7Y7J6?6 040F0z0Q743~7-4Y7@7:0i4w7?7~7_4v7i7}6)5 7m8q6.7q7Z01886_0z6{7w865C6B5l0_5o0b5q8l6=6H6v7(7K040g0L0Q0c0t8j568c8U5x8W5P6B5E5G8S7F7P5L6|8K6A5R1R7%8=7O047Q8_8D0d5a04438b6t8.5k5m8P8R7I9a8+7H4A8D6A0j2g2l8(5)8*0)7G8-3i7L8;9g8T9t8@999A8L8|5T5V8 7)7P5$5z0f4W4B4Q4D4N140P4G9U2F2A0L1Q9R0f4E5%0S0U0W0M04.

Exercice 9:⚓︎

Maximum d'une arbre

Compléter la fonction récursive maximum qui prend en paramètre un arbre binaire non vide implémentée comme ci-dessus arbre, et renvoie le plus grand élément de cet arbre.

👉 il faudra utiliser la fonction max de python. Vous pourrez utiliser la fonction taille vue plus haut.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013nco0m/gS-dfw,2y)eh43vblr_:p6k5 ix=8a(sP1tu050k0r0P0K0G0x0M0F0c0x0K0M0M0I010P0G0B010406050M0Q0f0f0K0y0p040i0d0x0Q0+0d0b050g0=0@0_0{0:0B04051b141e0g1b0:0k0G0v0Z0#0%0)0#0b0h0Q0K0h0r0j0B0p0P0s120F0s0G0h0s0x1G0s0P0.050U0w0x0r1n0$0(011F1H1J1H0P1P1R1N0P0y1c1B0Z0~0M0B0K0b0)0o011T1p010l0W0r0b0K0f0r1N1/1;1_1V1|1R1 210.0a0F0N0y0d0B0d0M0G110b0F0S1-0y0y0r0c2m14240b1c0g1B2z1)1+1*1O0k261q0G0b1~2j1N1k1m0!1U2J2L0b0d2P1N0B2s1c2x2z2$0;1:2n2R1`2V0y0^0x1N0K1E2s0l0)030z0z0c2W0r1J2U0d0j0O0J340.0O140K2%2*0/2)252,1V2.2:2=2@0r2_012{2}2 312M34361@040o3a3c1;3e2x2I013j0K2;1c2?0s2^2`2|2~0S3t2V3v0j0u0.0u3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350j0t0.0t3Z153#3f2+1o3i0d2/3I3l3M3n3O3r3R3=3T3@0E0.0E3|2$3$2*3F3*463.3q3Q304c333@0C0.0C4i3d1f2!142P2C0k1+2H3(014r2O1l1c2Z0r2#4A3}3C054r4R250G0k0)2|2x3U0O3l4Z4#4a4s324(1^2a0r4,4r3S4u364)2z3b3 3F0D0.0S0l3!4U3%410)0m0.0F552y4 4J0b0l0.0^0H0G0f0?5d4X402S010-040L5p5f583G0.0_0w2s5x575s5u0q0A5p0:4T5e3E4+014$2*3U3x3,0F5Q3:4b4/3@1@0F4=4@3;5#3w1N0g3b0F5;5c5G1`51040G545N045?4l5g0.0r0M0P0z0v4Z0r5F605z5u5w5}5y5s0b5B0y5D696f5@1V5I5K5}5M2(5P4!5R0z4%3@3W3K5X6w5Z4.3?363W5(204?6x4^4t3U6B3A5=6T5 3g5z5_2s0P0Q0y135}6V5r1`0f0G0.0e5L6a4Y6E6y5T3@3_6C5Y4-4_3U3_6K215*5!6H3^5.5:5=6g5^621J5|2$6)4m0.0U0W1R6;6*6p0.6e6u6b6h6j6l7m3F5I5p7g4J0d0.0I0I7z7a1V6,387w4J5u6r4j7w6|6z364f6{6?6O5,0j4f716M6F6~4e775~6U5;7H0)6Y0T6#6%7f7.5A040y0K0c3=7L6c7p7 7t045C5E6n7s1`7y6s7Q6?7S0j4w7V736G4d364w7#8i7(8l7*6T7^7:6!6$828981876W6h0w5j0K0H8x7o5v8H3)0.7{7}2L8K5t8z7r8B2-7u868T7n0)5I0n7G6o8L045k5m5o8A8Z8R8J8.7h040h0K0Q0c0s6m8Y7x8S4A8(7_858}91888I0q0q8$6(7^0b8D8*8F8Q6d8Q6i7`7|7~8=7M9056978)949i0.9a8%9t7_8+5n0f9w8;8~61040k2g2l959s8U8I7q969P9u6k8X9S8/5I99996:6f0g4W4B4Q4D4N140P4G9.2F2A0K1Q9+0g4E5M0S7j0X04.

Crédits⚓︎

Frédéric Junier, Romain Janvier