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 .ols./pngUciètfrea,d véumy050f040i0g0t0f0q0o0q0s0k0h0x0p0t0s0N0f0o0a0h0H0x0x0q0m0k0a0D0s0v0n0k0g0k0m0t0w0D0c0m0y0b0N0P0E0S0U0q0W0Y0!0g0r0.0g0N0X0+0l0o0^0N0j0#0j0p0u0a0k0o0t0p0-0s000a0o0h0q0+0c0p1j0@0t1c0P0d050e0A.
  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 .olsL./phngciftîear,d vé;umq050g040d0p0u0g0q0r0q0t0l0j0z0F0m0a0i0k0n0l0R0i0p0b0u0a0r0j0q0i0l0c0F0y0i0G0r0a0j0J0z0O0u0k0a0@0,0.0p0S0h0q0o0X0O0i0n0u0t000w0v0q0b0y0q0U0R0c180P0R0T0V0i1j0x0_110A0y0F0r0w0c0y0b0n1g0/0a0t0y0l170 0u0c0#0U0F190-1l0S1h0~0c170g0r0*0u1K0 0n1x1P0F0b0q1L1H1c160p0s1L0(1j0z1F0l0m0l0p0r0u0b1a1C171G1E0=0q0|0e050f0C.
  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 .8230ols./phngUciè)àftrea,(d véumby050g040k0i0y0t0q0q0t0r0y0x0t0y0D0b0s0x0Q0A0d0m0j0i0S0r0b0B0r0S0C0b0x0m0q0m0l0u0r0m0b0J0R0y0c000A0r0^0Q0B0y0d0E0d0r0n0C0S0L0N0l0r0B0A0S0g0u0s0y0B0%0y0q0{1g0`0J0t0|0t0h0V0d14160m0C0g0c0S0s1x0z0b0m0Q001p0S0z0u1I0B1n0w0.0:0=0t1n1R0y1T0s0m0u0D1I0y0j0c0b0D1U0t0v0y0A0l1+1K0Q0u0i1C1p1r0?0h0m1$1`0u0M261$0y0p0~101}210a0o0e050f0G.
  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 .ols.ê/phngUcji-ftread véum050g040k0i0s0v0p0a0i0l0q0n0I0v0g0y0r0F0R0i0w0a0n0F0q0a0y0m0!0r0c0v0b0F0z0e0z0S0x0c0y0b0q0t0q0O0%0*0s0)0-0/0)0t0r0j0y0/0i0q0)0s0`0E0v0z0a0u0n0p0X0v0r0X0i0v0s1o0u0s0h0a0(0v0u000s0b0+0o100s0d050f0B.
  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 .ols:.ê/phngcièftear,d Dvéumbq050h040w0r0j0c0v0b0q0v0h0r0s0r0u0m0k0A0M0o0a0j0l0p0m0Y0j0q0b0t0K0q0J0c0p0s0z0!0z0s0-0v0u0M0u0%0y0_0c0Y0p0v0m0A0A0z0r0B0L0J0d0v0)1b0v0(0N0q0z0x0q0j130O0J0f0:0M0A0a0S0o0m0 0J0r0h0s0n0J0L0@0v0l0s0y0r0#0Y0+0l0M0C0z0m1e0A0h0f0l0i0M1g0q0o0o0q0p0J0{0v0B0a0s0u0e050g0E.
  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 .ols»:.ê/pngcjiè)ftear«,(d Dvéumby050i040A0t0j0c0z0b0s0z0i0t0u0t0y0n0k0E0Q0q0a0j0l0r0n0$0j0s0b0w0O0s0N0#0%0)0$0N0c0$0r0z0y0;0z0B0t0P0D0u0N0l0a0E0Z0:0N0t0D0r0u100x0v0z0a0F0m0s0r0N0 0R1h0E0n0o1h0z0l0b0t0c0c0Q0d0p0z0e0z0-0P0N0i0s0D0B0s0j0}0g1g0Q0S1D0C101S0z0T0k0D0Z1T0~000D0,1%1f1y0?0(0*0j1l0D0z1h0j0B0a0G1!17191b12140u0~0Q1h0r0a150f050h0I.
  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 .olsxL:./pngcji)tfear,(d véumb050i04050l0a0w0r040s0m0a0A0p0v0n0u0x0b0o050h0H0J040x0j0r0x0B0I0n0q0n0(0s0A0l0A0%0x0y0s0t0n0s0C0b0(0r0d0n0c0p0s0j0p0(0f0x0l0r0b0s1b0t0z100p0x0t0r0j0y0a0.0x0?0(0j0O0y1d0 0U13180g0x0e0r0c0x0:0p1m1H0a0i0p0n0a0j1H0i0t0I0A131n1k0p0O181H0J1H0r0q0q0r0p1(0(0C0a0t0w0x0v0*0w0,0n0l0s1P1R0x0w001t0^0`0|0~100d180t0@0O230(1e1A140(0i0s0c0c1i0x1n1I0t0k0A0B1Z0o0g0X0E.
  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 .olsxL.:/pPn2c*i)-tfear(d éumby050i040e0t0y0B0a0r0q0m0b0z0y050m0a0x0t040b0u0B0C0x0u050h0T0V040y0i0t0v0B0t0r0y0V0y0m0v0z0/0@0t0c0y0s0a0k0m0r0o13100u0k130D0;100w0c1a100S0U0W0V0s0(0*0W0p0y0c0a0A10120:0I0T0k0V0k0c0|0f0y0j0u0v0y0t0d0t0B0i0b0I0g0R1q0X0Z0#0u0y0d1U0d0n0n0l1p1l040f0(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 .çolsL.ê/pngcjiftear,d éumbq050i040e000r0z0d0q0j0l0q0v0u000q0o0o0q0p0d0N0M0z0b0s0u0v0T0v0c0r0v0p0s0r0j0d0i0r0s0J0L0v0s0w0o0w0?0j0p0n0q0c0c0M0k0=0.100d0I0 0v0A0x000x0j0M0o0b0K101l0v0i0x0?0v0I0v0l0b0y0i0Z0p0M0p0b0x0m1E0s0V0u0M0)0v0y0g0y1j0r0a1o1z1r0W0V0J0,0w0q0V0n1K0 0n1e1$0t1v0M1e0n1t0n1y0c0n0o110v0k0-0j1K1Q1c140V1B0d0U0v1h0n0p0r0n0?0d0f050h0C.
  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 .ols:./phPngcji)-tfear,(d véumby050g040i0E0q0h0a0j0y0s0c0q0y0B0N0b0t0j0k0t0k0s0y0k0A0j0A0u0t0b0n0Q0#0w0C0B0b0q0n0p0g0t0+0x0n0k0C0P0o0y0d0y0n0b0y0g0s0u110R0x000A0l0u0n0u0#0x0P190u0a0k0+0C110c0y0x0W1w0b0#0Q0E1B160C0g0*0t0^0r0v0y0r0M0l0^0M0j0s180a0B0y0a1j0s0j0q0A1Z0D0m0s0q1N0c1V0M0y1B1w0D0P0a0n0j1w0x1Y0x0A0z1;0g1a0B0u0e050f0G.

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

.128013So4lR7s_60:w/+phPn1gk2c=i)-tfear3(d vé;umbyq050J0E0C0F0z0e0h0K0x0e0F0h0h0y010C0z0p010406050h0O0P0P0F0G0R040b0c0e0O0-0c0s0K020F0P0p0N0K0f0E0`0G0S0O0E0h050n0@0_0{0}0=0p04051s1l1v0n1s0=0J0z0L0#0%0)0+0%0s0u0O0F0u0E0B0p0R0C0q140K0q0z0u0q0e1X0q0C0:050W0Q0e0E1E0(0*011W1Y1!1Y0C1*1,1(0C0G1t1S0#100h0p0F0s0+0w011.1G010D0Y0E0s180E1(23252a1:2d1,2g0P2i040a0K0r0G0c0p0c0h0z13150U210G0G0E0x2D1l2k0s1t0n1S2P1}1 1~1)0J2m1H0z0s2f2A1(1B1D0$1/2Z2#0s0c2)1(0p2I1t2N2P2_0?24152+2b2/0G0`0e1(0F1V2I0D0+030i0i0x2:0E1!2.0c0B0j0B0t0:0t1l0F2`2}0;2|2l2 1:313335370E39013b3d3f3h2$3k0B28040w3q3s253u2N2Y013z0F341t360q383a3c3e0U3J2/3L0H0:0H3Q2M3t0=3U3x0+3X3Z053#3%3F3)3I2!3K3l0d0:0d3=1m3t1w2@1l2)2S0J1 2X3`013*2s0T1C1t2?0E2^4c4b3S054n4u2l0z0J0+3c2N3L3n3!0K4C4E3H3+443-3l3n0K2q0E4M4n3,3j4R1(0n3r3v2~1F1:0v0:0U0D3?4x3_4*0+0m0:0K4:2O4(3V0s0D0:0e141K0E0O0G4{4A4)2,010/040I584}4l0s510z0h0C0E5g4=5b5d0A0l580=4w4|3U4L014F2}3L3N3~4K4D5B4N3g4P4Z3M294U4W433i5E4#3r0K5X4`5q2b4,040z4/5x045Z2}4~0:1j0C0i0L4C5o5*5h4?5c0:5f5_5!3y5k5m5^2{600+5s5u5*5w655-5A5C253.3B6e5K4Y6h4T2h5R4O5T3l3/2P5W5Y6w5`5b5$2I0C560s585,3w5{0P0z0:0k5v5p6d5I6f0s3L474J6j4X5M6T5P6o5J6X6r0B6U3Q6x66016A0V6D6F6y2b6J3o6=6-0c0:0o6`5-5i51531i566O6H5r5}765a300:1h55644c6-5d5~6c777c041!637a3V5s0A6N5_0n4z4d4t4f4q1l0C4i7D2V2Q0F1+7A0n4g1r593V2I0P0i0D0F0v0E0i0q6t1d1f7e0!692{1y3u1s0 112D0K2f0K0M0x0G2C561-0D142K0z142#0e1,0K0l4`7+1A1C3V1I1K1M1O1Q1S1U1=1Z1#1%4r4e7*2{7y5z6Q0i4G0g3m6i8t6%3K8w4S5Q6$5S8B8x3C3E3G8A3-8C5V7P717o7355575*6G7b1:6|040y6 7m4+51180Q0J0F8%8Y3{625n7r4l5d7)3t8X3V6^046M8W6?8)5%5)2_8|8R5:5=5@8@5{7j9c5b5j7o5l8?5 709d0:7u916-5$3g0h7g3S976I6K043p9q9m5b8!6~9C8(8;8S1J748V7l8:5|5e9f7n7e1i9S1:9e9l9I3W8=9v5y9D2b7t7v7*7y1y4e7M4q5w0U0W0Y0h04.

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

.128013So4lR5s_:w/phPn1gk2c=i)-tfear39,8d( vé;umbyq050I0B0z0C0w0e0h0K0u0e0C0h0h0v010z0w0m010406050h0O0P0P0C0D0R040b0c0e0O0-0c0p0K020C0P0m0N0K0f0B0`0D0S0O0B0h050l0@0_0{0}0=0m04051s1l1v0l1s0=0I0w0L0#0%0)0+0%0p0r0O0C0r0B0y0m0R0z0n140K0n0w0r0n0e1X0n0z0:050W0Q0e0B1E0(0*011W1Y1!1Y0z1*1,1(0z0D1t1S0#100h0m0C0p0+0t011.1G010A0Y0B0p180B1(23252a1:2d1,2g0P2i040a0K0o0D0c0m0c0h0w13150U210D0D0B0u2D1l2k0p1t0l1S2P1}1 1~1)0I2m1H0w0p2f2A1(1B1D0$1/2Z2#0p0c2)1(0m2I1t2N2P2_0?24152+2b2/0D0`0e1(0C1V2I0A0+030i0i0u2:0B1!2.0c0y0H0y0q0:0q1l0C2`2}0;2|2l2 1:313335370B39013b3d3f3h2$3k0y28040t3q3s253u2N2Y013z0C341t360n383a3c3e0U3J2/3L0E0:0E3Q2M3t0=3U3x0+3X3Z053#3%3F3)3I2!3K3l0d0:0d3=1m3@3v2~1F3y0c323Y3B3$3D3(3H3+443-3l0g0:0g4a2{1y2@1l2)2S0I1 2X3`013*2s0T1C1t2?0B2^3t3?3S054I4P2l0w0I0+3c2N3L3n3!0K4X4Z4o3g4q3j3l3n0K2q0B4+4I3,4/3m1(0l3r4d3V0s0:0U0A4R2O504G0k0:0K564V4e2,3W0A0:0P2!0w0P0^5d584f0+0/040J5p3_5r3W0:1!0h0z0B5w2}3V5t0x0j5d0=4b4S3U4*014!2}3L3N3~4)4Y5R4,4`5U294?4^433i5$2P3r0K5/5c5x5g52040w555N2O5;5G4G0p0:1j0z0i0L4X5E5{5e5H0:5v685q5g60041h0B1i5F3w5y5t6c2{5=305A0w5C676q5~6n0:0x5J5d5}6m5g0u4%030K0U0D0p0w0B0D0K0M0e0M2r0p0z6K1-0%0K5B5D5L6l155Q5S253.3B6+5!4.6.4=2h5)4p5+3l3/5-045:706E5f2b5@2I0z0O6M6D6e6s045D6%6d6r1:6o6)3V6g6$6w4Q7h5s6A6(7g5G6:4#466/5Y426`450y476@2r6_4-6{7E4}5.5:7b1:5@3g0h7o5O6y5g5t5K685M6x4W7A0i7x0y4t4(6:4_6=4s5%6^5Z7/7K7,3Q717O7q01750V780p7a7~0p0Q5j2!7k4G7j7u6F7c7e7U577~8c7$733y6t6v8a6z040x0G847W7c5k6N5n0P8q7X6b8C7c6i6k8d8m7r5u8F8n047n8N8L6B0x7t4x4U1w4z0l4B1l0z4D8$2V2Q0C1+4O4A4L1r694G2I0P0i0A0C0s0B0i0n6}1d1f6i0!7Z4x1z1u0~10120w1U2f6R0u0D2C781-0A142K9c0p2#0e1,0K0j5c1y3u2)3V1I1K1M1O1Q1S1U1=1Z1#1%4M4z4x2{8X5P7(4#0F4|7-7(7^3K9T4;5(7@5*9Y4|3C3E3G9X3-9Z7M8=5y6g8y5m5o68723V0c0:0v8v8e7Q5A180Q0I0Ca08K5z8P6u7f8l6a04953t9{5 0:8g8R018k7p8w8O8Q8Jaf8U9`7P0+5@5_a87l615C6466anap7Va13{0:8H8h9;8D8Mauakab8paT8r6BaC4G7R0ZaPaj9=87048yaI8EaX6fal0VaPayaoa/aeaUata{aY8uax85888z9_a~aR6paqaLaaaOa.aSb67ca}b9a95IaZ7!5p0l8X4y8.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

.128013TSo4lR57s_06:w/phPn1gk2c=iF)-tfear3,(d vé;umbyq050M0G0E0H0A0f0j0N0y0f0H0j0j0z010E0A0q010406050j0R0S0S0H0I0U040c0d0f0R0:0d0t0N020H0S0q0Q0N0g0G0}0I0V0R0G0j050p0`0|0~100^0q04051v1o1y0p1v0^0M0A0O0(0*0,0.0*0t0v0R0H0v0G0D0q0U0E0r170N0r0A0v0r0f1!0r0E0?050Z0T0f0G1H0+0-011Z1#1%1#0E1-1/1+0E0I1w1V0(130j0q0H0t0.0x011;1J010F0#0G0t1b0G1+26282d1?2g1/2j0S2l040a0N0s0I0d0q0d0j0A16180X240I0I0G0y2G1o2n0t1w0p1V2S2022211,0M2p1K0A0t2i2D1+1E1G0)1=2$2(0t0d2,1+0q2L1w2Q2S2|0_27182.2e2=0I0}0f1+0H1Y2L0F0.030k0k0y2?0G1%2;0d0D0u0l3n0?0u1o0H2}300@2 2o321?3436383a0G3c013e3g3i3k2)3n3p2b040x3t3v283x2Q2#013C0H371w390r3b3d3f3h0X3M2=3O0D0J0?0J3T2P3w0^3X3A0.3!3$053(3*3I3,3L2%3N3o0D0e0?0e3_1p3{3y311I3B0d353#3E3)3G3+3K3.483:4a0h0?0h4f2|3|303Y404p443J3-3j4v3m4a0m0?0m4B4h3}4k3 4m3D3%3F3H4J473l3;0i0?0i4S3V1z2`1o2,2V0M222!3~014K2+1F1w2_0G2{3w3`4.4K522o0A0M0.3f2Q3;0u3E595b4t4L4(4a5f0N2t0G5i4K3/4N3p5f2S3u4i3Y0w0?0X0F542R5z4`0o0?0N5F574j2/3Z0F0?3h0t0:2i0E5M5H4V010=040L5Y4U5P0t0?1%0j0E0G5)4E4`5$0K5M5L5*330?0O5=3z5!5$0C0n5M0^4g4.3X5h015c303;3Q420N6b464u5l3P2c5p5r4%496n5x040N6w5{5?5!5B040A5E682R6y615+0?1m0E0k0O595;6F5N3Y5$5(6R5Z6J045.5:605O2e63656R672~6a5a6c0k5d4a3?4Z6j5j5t3;3?5o2k6q6l6s3=1+0p3u6x776H6%1?6B2L0E0R0I0t5`6X2e0w0y0?0B3#0j6Q4C6$6i6/6d283;4c6^7v6`4M7y6o6 6:5s7D4a7z3T777j7b6K1%6E2|794F0?5:6#6W5|1?6U7t4`5,6Z0A5/7r537!0.637i7/010d0?0z0z7=6z6Y5 7Z7}6(0?6*7s80587B6=3p4y7A705k724y6~2u8d6{4x7476786w7O0.7c0Y7f7h6R7U4`7l0?0b0I1l667t6_890D4P8c7H6r4w3p4P8h5q8L718N8I8m6v6x8q016B3j7q7%62838E86188G6e4a4*8K6k8e8U4*8Q8j7J3p8;7M8o8x6A0?7d8u7|6I5}045T5V5U8(5P7$8,7V041k0G8D9g5@0?6V6-813B5-7+7Y9q977#0?0C5_8w8Z7)7 9w7a7:9z8+2~0p564/514;4~1o0E4@9S2Y2T0H1.9P0p4=1u6S4`2L0S0k0F0H0w0G0k0r6@1g1i9j0%84531B3x1v12142G0N2i0N0P0y0I2F7f1:0F172N0A172(0f1/0N0n5L9}1D1F3Y1L1N1P1R1T1V1X1^1$1(1*4 4:9L2~9N6.5i6=0u3q8=7C5laK5n6p8S8@4NaP2c4q4#8?8kaV6u9D5S179b5X9C7?7^047{a,9r8r5-1b0T0M0H969H3Z9t7,9d82049B7Ta%049F7.a=5#8*a;9x8r7m047o0$7-3V915P6B6Da|9h6L6N6Pb19y5%bv3 a 9vb9bebb040Cbq8y7Q8%bda}8z048B9lb57?bo7S3wbm98b8bl8Za.7`bH5!7)7Xbk5G7?9f9G9h6!b+9(8)bFb%bnbJb=bW9s99a)0A5WbybE9pbCa}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

.128013So4l5s_:w/phPn1gk2c=i)-tfear3,(d vumbyq050G0A0y0B0v0e0g0H0t0e0B0g0g0u010y0v0l010406050g0J0K0K0B0C0M040b0c0e0J0(0c0o050k0/0;0?0^0-0l040518111b0k180-0G0v0I0W0Y0!0$0Y0o0q0J0B0q0A0x0l0M0y0m0 0H0m0v0q0m0e1D0m0y0+050R0L0e0A1k0Z0#011C1E1G1E0y1M1O1K0y0C191y0W0{0g0l0B0o0$0s011Q1m010z0T0A0o0B0K0A1K1,1.1?1S1_1O1|1~0+0a0H0n0C0c0l0c0g0v0~0o0H0P1*0C0C0A0t2j11210o190k1y2w1$1(1%1L0G231n0v0o1{2g1K1h1j0X1R2G2I0o0c2M1K0l2p192u2w2Z0.1-2k2O1@2S0C0=0e1K0B1B2p0z0$030h0h0t2T0A1G2R0c0x0p0D310+0p110B2!2%0,2$222)1S2+2-2/2;0A2?012^2`2|2~2J31331;040s37391.3b2u2F013g0B2.192:0m2=2@2_2{0P3q2S3s0x0D0+0D3x2t3a0-3B3e0$3E3G053I3K3m3M3p2H3r320x0d0+0d3W123Y3c2(1l3f0c2,3F3i3J3k3L3o3O3/3Q3;0f0+0f3_2#1e2X112M2z0G1(2E3#013N1 194k1a4i4g2#4r2Y2%0H0v0G0$2_2u3R0p3i4D4F472}49303;4J0H270A4M4r3P4Q334J2w383|3C0r0+0P0z3X3z4(4p0j0+0H4.2v4:3~3$0z0+0B0l0l1G0N0J0A4^4A3d4{010*040F564`2P3D0+4-3`4/3!595b0E564@5m5g0o0+1G0g0y555k4_5s1@5b0w0i560-5A572k4L014G2%3R3u3)4C4E5N4N4Y5Q1=4U4W3.2 5Y4$040H5+5r4B4p4*040v5j2Z5-585t0+0A5x0h0I4D5z2#5C1S5b5d5J5f2*5v0v5x613a68640+5F5H5e3B5M5O1.3R3T3H5T5#485%3;3T4T1}4V5V4X4P6p1K0k385,6I5^3}5g5:2p0y0J0C105J6K3C5u040t2p0A0C0h5w5y6k5.5n0+0F0w6j676l5U6n0o3R3?6r6m5W6D3;3?6y1~6t4O6v336_3x6I6f0$5:2}0g6d5l6*5g5b5G5J5I624B6{4H4b4K6=6|740x4c706A3-6u3:334c5)6J5,79016N0Q6Q6S5@7H6W2{0o0g6)5_5D6,7T6L69045?6e630$657X6V0+5y6(6:7g7V5c7*4p6W6%7e5B7:6g040w0w5p6T7O4~5052547?6+7=7/7U3f5i887h0+817N7%5h04530A878b7Y7}667m8c3$6a6c8f7;7 6.7k5e0k4z1c4i0k4u2x4m112A8N0B1N0A2w4k5I0P0R0T0g04.

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

.128013So4l57s_N60:w/phPn[1gk2c=i)-tfear398(d v]umby050M0F0D0G0A0e0h0N0y0e0G0h0h0z010D0A0p010406050h0Q0R0R0G0H0T040b0c0e0Q0.0c0s050o0^0`0|0~0?0p04051e171h0o1e0?0M0A0O0$0(0*0,0(0s0v0Q0G0v0F0C0p0T0D0q150N0q0A0v0q0e1J0q0D0;050X0S0e0F1q0)0+011I1K1M1K0D1S1U1Q0D0H1f1E0$110h0p0G0s0,0x011W1s010E0Z0F0s0G0R0F1Q1=1@1|1Y1 1U22240;0a0N0r0H0c0p0c0h0A140s0N0V1:0H0H0F0y2p17270s1f0o1E2C1,1.1-1R0M291t0A0s212m1Q1n1p0%1X2M2O0s0c2S1Q0p2v1f2A2C2)0@1?2q2U1}2Y0H0{0e1Q0G1H2v0E0,030i0i0y2Z0F1M2X0c0C0u0d370;0N0u170G2*2-0=2,282/1Y2;2?2^2`0F2|012~3032342P37391`040N0x3e3g1@3i2A2L013n0G2@1f2_0q2{2}2 310V3x2Y3z0C0I3b0I3F2z3h0?3J3l0,3M3O053Q3S3t3U3w2N3y380C0d3b0d3(183*3j2.1r3m0c2=3N3p3R3r3T3v3W3`3Y3|0f3b0f412)3+2-3K3/4b3?3u3V334h363|0k3b0k4n433,463.483o3P3q3s4v3_353Z0g3b0g4E3H4p3k4H3L4J4a4L4c4N3^4g4Q3|0K3b0K4V2B4X452V4!493:3=4d3@4f4x4,390J3b0J4;3I4q3-4_4K3;4M4e4w3X4z390u0l0;5j564?4r4#4{5d4~5f4y3Z0u0u5l3d0o3f3)3H1i2%172S2F0M1.2K594w2R1o1f2$0F2(3h5D2B054w5U280A0M0,2 2A5w3p5$5(4 5g5+0N2d0F5.5u513a2C5C4G4^0w0;0V0E5W5!4@1}0n3b64444r0E0;0F0h0D0i0O5$0F6a5~1}0:040L6m584Z0s0;0|0S2v6s4Y4^6p0B0m640?425E3J5-015)2-3Z3B5c6L4*503{3A1{5?5^4P6V0C6Q5B3C0N6*6b5960042v0D0Q0H166I2B0N6,6u6w0H6y6l6^3C6{4^0c68040A0h646`6n1Y0w0y0;0j15704o6A2q6S0i5*3|3#4L7n5_6#3#5=235@6M5/5v7q1Q6(6H2+6K5%7A7p393~7s7J6T5:3|3~7x246Z4+6#7N3(7c0,6.627l3K766`71732:6d040v0G0Q0y0q7j5V7#016p6r7-7|6v046x6z806t6C0;6E6G7)7n7L0C4k7O7W6U4i394k7U7z7Q7C8l7E3f6*6+7|6.6:6=6@2)7b872:6}6 7)596p0t8H4Z0R0A0;0l8L88040P8b865#7P7o6O4A5,8Y7u8k0C4B8n8i7R394B5|3i8W7m8Y8e4S8h7A8(5h0C4S8,8|6!8)8`7!8D7d613r8R67698?6c612j2o7`6J970,7~9b3m8F857H9l7}896F717G7{4q8d8!394.8{8p5`4.919G6#9E3F8u8C6B1}8x0W8z7a7.9p836~9r9z9Q1Y8J9o0,8N0;3E9e8I0;8U9x8c8^9C0C539F7B5`539J9|6#9`3F9y9k8X5.8e5j8$8-8q375k9 8}5w5k8;9W7$99639.4Z7+9)3L7:0H0G0y3`ar9nao4^82849j5X7|6D9w7k9e9B1@5w5y9{ag3|5x6X7yab5`aS8;9Oak019S6;6?9V819qaE653K9(aA1}9+045A9s9$9m9:8V2+0o5Z5F5T5H5Q170D5Kb42I2D0G1Tb10o5I6H0V0X0Z0h04.

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

.128013So4l5s_0:w/+phPn1gk2c=i)-tfear3(d vumby050H0C0A0D0x0e0g0I0v0e0D0g0g0w010A0x0n010406050g0K0L0L0D0E0N040b0c0e0K0(0c0q050l0/0;0?0^0-0n040518111b0l180-0H0x0J0W0Y0!0$0Y0q0s0K0D0s0C0z0n0N0A0o0 0I0o0x0s0o0e1D0o0A0+050R0M0e0C1k0Z0#011C1E1G1E0A1M1O1K0A0E191y0W0{0g0n0D0q0$0u011Q1m010B0T0C0q0D0L0C1K1,1.1?1S1_1O1|1~0+0a0I0p0E0c0n0c0g0x0~0q0I0P1*0E0E0C0v2j11210q190l1y2w1$1(1%1L0H231n0x0q1{2g1K1h1j0X1R2G2I0q0c2M1K0n2p192u2w2Z0.1-2k2O1@2S0E0=0e1K0D1B2p0B0$030h0h0v2T0C1G2R0c0z0r0f310+0r110D2!2%0,2$222)1S2+2-2/2;0C2?012^2`2|2~2J31331;040u37391.3b2u2F013g0D2.192:0o2=2@2_2{0P3q2S3s0z0F0+0F3x2t3a0-3B3e0$3E3G053I3K3m3M3p2H3r320z0d0+0d3W123Y3c2(1l3f0c2,3F3i3J3k3L3o3O3/3Q3;0f0+0f3_2#1e2X112M2z0H1(2E3#013N1 194k1a4i4g2#4r2Y2%0I0x0H0$2_2u3R0r3i4D4F472}49303;4J0I270C4M4r3P4Q334J2w383|3C0t0+0P0B3X3z4(4p0k0+0I4.2v4:3~3$0B0+0R0T1O4^4A3d4{010*040G524`2P3D0+0?0M2p5a3!55570y0j520-3`4/3B4L014G2%3R3u3)4C4E5u4N4Y5x1=4U4W3.2 5F4$040I5O4@5j5c4*040x4-5q2v5Q4B4p0q0+0C0g0A0h0J4D0C5i5!5k0+595X533}5c5$045f5h5@5b1@5l5n5@5p2#5s5B5v1.3R3T3H5A5I485K3;3T4T1}4V5C4X4P6b1K0l385P6u5Z545S0+2p0A0K0E105@6w5_1@0L0x0+0i5o5/225t690q3R3?6d6Q5D6p3;3?6k1~6f4O6h336U3x6u601S5T2}0g5.6F6.0$57632Z653a4(6W4H4b4K686X6)0z4c6#6m3-6g3:334c5M6v5P6^015T6A6C6E2Z6G3C6J35527q4p0c0+0m7u7j5{4 0e515 5R615=6O6H3f0+0s0D0K0v0o6?665:5c575?7U6x2*5e0E5g7T6~7H1S5l0y7A7+0$7x047z6@7:5d047D7F7Z7L6_7J7G7V7#040H2d2i7)5r837,817~3C5{5}894_7_7-6N5 0l4z1c4i0l4u2x4m112A8w0D1N0C2w4k5p0P7D0g04.

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

.128013So4l5s_x60:w/+phPn1gk2c=i)-tfear3,(d vumby050K0E0C0F0z0e0g0L0x0e0F0g0g0y010C0z0p010406050g0N0O0O0F0G0Q040b0c0e0N0+0c0s050n0=0@0_0{0:0p04051b141e0n1b0:0K0z0M0Z0#0%0)0#0s0u0N0F0u0E0B0p0Q0C0q120L0q0z0u0q0e1G0q0C0.050U0P0e0E1n0$0(011F1H1J1H0C1P1R1N0C0G1c1B0Z0~0g0p0F0s0)0w011T1p010D0W0E0s0F0O0E1N1/1;1_1V1|1R1 210.0a0L0r0G0c0p0c0g0z110s0L0S1-0G0G0E0x2m14240s1c0n1B2z1)1+1*1O0K261q0z0s1~2j1N1k1m0!1U2J2L0s0c2P1N0p2s1c2x2z2$0;1:2n2R1`2V0G0^0e1N0F1E2s0D0)030h0h0x2W0E1J2U0c0B0t0j340.0t140F2%2*0/2)252,1V2.2:2=2@0E2_012{2}2 312M34361@040w3a3c1;3e2x2I013j0F2;1c2?0q2^2`2|2~0S3t2V3v0B0H0.0H3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350B0d0.0d3Z153#3f2+1o3i0c2/3I3l3M3n3O3r3R3=3T3@0f0.0f3|2(1h2!142P2C0K1+2H3(013Q221c4n1d4l4j2(4u2#2*0L0z0K0)2|2x3U0t3l4G4I4a304c333@4M0L2a0E4P4u3S4T364M2z3b3 3F0v0.0S0D3!3C4+4s0m0.0L4;2y4?413)0D0.0q0F100E0N0G4{4D3g4~010-040J584}2S3G0.0_0P2s5g3%5b5d0A0l580:3}4=3E4O014J2*3U3x3,4F4H5A4Q4#5D1^4X4Z3;325L4)040L5U4`5p5i4-040z4:5w2y5W4E4s0s0.0E0g0C0h0M4G0E5o5*5q0.5f5%59405i5,045l5n5}5h1`5r5t5}5v2(5y5H5B1;3U3W3K5G5O4b5Q3@3W4W204Y5I4!4S6h1N0n3b5V6A5)5a5Y0.2s0C56135}6C5 1`0O0z0.0k5u5^255z6f0s3U3_6j6V5J6v3@3_6q216l4R6n366Z3A6A661V5Z300g5@6K6?0)5d692$0L6b3d4+6#4K4e4N6e6$6.0B4f6*6s3:6m3?364f5S6B5V6}015Z6G6I586L3F6O387u7p0c0.0o7z5X2-0P0.0^0i6T6M1V5d5|6c5_6051530C5557657F7N5{7L3F610u530x0q6{7Q6D677#7Y7R2-5k0G5m7-747Z6~0.0A0A0I7E7?3i7T54567$4s7O895b610K2g2l7{5x847~5e8c7S627_647.7M8l800A6S650n4C1f4l0n4x2A4p142D8H0F1Q0E2z4n5v0S0U0W0g04.

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

.128013TSo4l57s_6:w/phPn1gk2c=iF)-tfear3,(d vumby050K0E0C0F0y0f0i0L0w0f0F0i0i0x010C0y0o010406050i0N0O0O0F0G0Q040c0d0f0N0+0d0r050n0=0@0_0{0:0o04051b141e0n1b0:0K0y0M0Z0#0%0)0#0r0t0N0F0t0E0B0o0Q0C0p120L0p0y0t0p0f1G0p0C0.050U0P0f0E1n0$0(011F1H1J1H0C1P1R1N0C0G1c1B0Z0~0i0o0F0r0)0v011T1p010D0W0E0r0F0O0E1N1/1;1_1V1|1R1 210.0a0L0q0G0d0o0d0i0y110r0L0S1-0G0G0E0w2m14240r1c0n1B2z1)1+1*1O0K261q0y0r1~2j1N1k1m0!1U2J2L0r0d2P1N0o2s1c2x2z2$0;1:2n2R1`2V0G0^0f1N0F1E2s0D0)030j0j0w2W0E1J2U0d0B0s0h340.0s140F2%2*0/2)252,1V2.2:2=2@0E2_012{2}2 312M34361@040v3a3c1;3e2x2I013j0F2;1c2?0p2^2`2|2~0S3t2V3v0B0H0.0H3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350B0e0.0e3Z153#3f2+1o3i0d2/3I3l3M3n3O3r3R3=3T3@0g0.0g3|2$3$2*3F3*463.3q3Q304c333@0k0.0k4i3d1f2!142P2C0K1+2H3(014r2O1l1c2Z0E2#4A3}3C054r4R250y0K0)2|2x3U0s3l4Z4#4a4s324(1^2a0E4,4r3S4u364)2z3b3 3F0u0.0S0D3!4U3%410)0m0.0L552y4 4J0r0D0.0F0o1:0G0+1~0C5d4X402S010-040J5r5f583G5j0G0P2s5z575u5w0I5r5c5I2-0.0M3I0E0N0G5H4l4J5w0A0l5r0:4T5e3E4+014$2*3U3x3,0L5+3:4b4/3@1@0L4=4@3;5_3w1N0n3b0L655N5X5B51040y545(04673g5B0r0.0E0i0C0j0M4Z0E5W6h5J0.5y6e5A5u6j040_5F6r6x5O1V5Z5#6e5%2(5*4!5,0j4%3@3W3K5=6O5@4.3?363W5|204?6P4^4t3U6T3A666/6g5t1`6a2s0C5U136e6;500w0.0z3I0i6E4j6s2n5?6Q5.3@3_6U786*603^4;6%5~5^6Z7h4}6f666y6?6k1J6d2$6}5g0.0G0F0w3=763F5w6w6M686z5D6D7E5Y0.0A5M7r1V0d0.0x0x7R6G3)5Q5S5U7N5B5w6J756F4l786R364f7d6W4-4_3U4f6$217k6Y4d7;62646:657S0)6@0T6`7Y7J6?6 040b0G0N743~7-4Y7@7:0B4w7?7~7_4v7i7}6)5 7m8q6.7q7Z01886_0G6{7w865C6B5l0_5o0r5q8l6=6H6v7(7K040t0F0N0w0p8j568c8U5x8W5P6B5E5G8S7F7P5L6|8K6A5R1R7%8=7O047Q8_8D0d5a04438b6t8.5k5m8P8R7I9a8+7H4A8D6A0K2g2l8(5)8*0)7G8-3i7L8;9g8T9t8@999A8L8|5T5V8 7)7P5$5z0n4W4B4Q4D4N140C4G9U2F2A0F1Q9R0n4E5%0S0U0W0i04.

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

.128013So4l5s_x60:w/phPn1gk2c=i)-tfear3,8(d vumby050K0D0B0E0y0e0g0L0w0e0E0g0g0x010B0y0o010406050g0N0O0O0E0F0Q040b0c0e0N0+0c0r050n0=0@0_0{0:0o04051b141e0n1b0:0K0y0M0Z0#0%0)0#0r0t0N0E0t0D0A0o0Q0B0p120L0p0y0t0p0e1G0p0B0.050U0P0e0D1n0$0(011F1H1J1H0B1P1R1N0B0F1c1B0Z0~0g0o0E0r0)0v011T1p010C0W0D0r0E0O0D1N1/1;1_1V1|1R1 210.0a0L0q0F0c0o0c0g0y110r0L0S1-0F0F0D0w2m14240r1c0n1B2z1)1+1*1O0K261q0y0r1~2j1N1k1m0!1U2J2L0r0c2P1N0o2s1c2x2z2$0;1:2n2R1`2V0F0^0e1N0E1E2s0C0)030h0h0w2W0D1J2U0c0A0s0I340.0s140E2%2*0/2)252,1V2.2:2=2@0D2_012{2}2 312M34361@040v3a3c1;3e2x2I013j0E2;1c2?0p2^2`2|2~0S3t2V3v0A0G0.0G3A2w3d0:3E3h0)3H3J053L3N3p3P3s2K3u350A0d0.0d3Z153#3f2+1o3i0c2/3I3l3M3n3O3r3R3=3T3@0f0.0f3|2$3$2*3F3*463.3q3Q304c333@0j0.0j4i3d1f2!142P2C0K1+2H3(014r2O1l1c2Z0D2#4A3}3C054r4R250y0K0)2|2x3U0s3l4Z4#4a4s324(1^2a0D4,4r3S4u364)2z3b3 3F0u0.0S0C3!4U3%410)0m0.0L552y4 4J0r0C0.0^0i0y0O0?5d4X402S010-040J5p5f583G0.0_0P2s5x575s5u0z0l5p0:4T5e3E4+014$2*3U3x3,0L5Q3:4b4/3@1@0L4=4@3;5#3w1N0n3b0L5;5c5G1`51040y545N045?4l5g0.0D0g0B0h0M4Z0D5F605z5u5w5}5y5s0r5B0F5D696f5@1V5I5K5}5M2(5P4!5R0h4%3@3W3K5X6w5Z4.3?363W5(204?6x4^4t3U6B3A5=6T5 3g5z5_2s0B0N0F135}6V5r1`0O0y0.0k5L6a4Y6E6y5T3@3_6C5Y4-4_3U3_6K215*5!6H3^5.5:5=6g5^621J5|2$6)4m0.0U0W1R6;6*6p0.6e6u6b6h6j6l7m3F5I5p7g4J0c0.0x0x7z7a1V6,387w4J5u6r4j7w6|6z364f6{6?6O5,0A4f716M6F6~4e775~6U5;7H0)6Y0T6#6%7f7.5A040F0E0w3=7L6c7p7 7t045C5E6n7s1`7y6s7Q6?7S0A4w7V736G4d364w7#8i7(8l7*6T7^7:6!6$828981876W6h0P5j0E0i8x7o5v8H3)0.7{7}2L8K5t8z7r8B2-7u868T7n0)5I0H7G6o8L045k5m5o8A8Z8R8J8.7h040t0E0N0w0p6m8Y7x8S4A8(7_858}91888I0z0z8$6(7^0r8D8*8F8Q6d8Q6i7`7|7~8=7M9056978)949i0.9a8%9t7_8+5n0O9w8;8~61040K2g2l959s8U8I7q969P9u6k8X9S8/5I99996:6f0n4W4B4Q4D4N140B4G9.2F2A0E1Q9+0n4E5M0S7j0X04.

Crédits⚓︎

Frédéric Junier, Romain Janvier