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.

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 (sinon les exercices ne fonctionneront pas). 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

.128013f:0Sd=4yr/opg2mcb1wR3ve l+P)tikné;ua(_shq050f0x0D0K0E0z0N0y0q0z0K0N0N0g010D0E0m010406050N0J0p0p0K0j0i040e0l0z0J0*0l0G0y020K0p0m0I0y0u0x0@0j0P0J0x0N050k0;0?0^0`0/0m04051p1i1s0k1p0/0f0E0w0Y0!0$0(0O0E0n0O0z1G0O0D0-050T0r0z0x1B0#0%011F1H1J1H0D1P1R1N0D0j1q0D0O0Y0}0N0m0K0G0(0o011T1D010b0V0x0G150x1N1:1=1`1V1}1R200p22040a0y0B0j0l0m0l0N0E10120R1.0j0j0x0q2n1i240G1q0k1,2z1)1+1*1O0f260(1J0G1 2k1N1y1A0Z1U2J0E2L0G0l2P1N0m2s1q2x2z2%0:1;122R1{2W0j0@0z0-0s2w2+0.2*252-1V2/2;0-0o2^1=2`2x2I012 0K2=040v332y0/362}0(393b0h3e2z2!0x2z2P2C0f1+2H3i010q2X2c0Q1z1q3p2$2_3n053z0R3G2|1C1V0F0-0R0b3I3h3O0(0t0-0y3U2+370G0b0-0z110n1f0J0j3#3N2S010,040L3;2,3W383*0E0N0D0x3{373^0C0c3n060y4b3!3V3?3Q040E3T1j2_4d3$3x0G0-1g0D0M0w0E0R443x3^3`4k342{3|3?4p041J41434B2y4D450-47494c4S4m3=1{4g2s0D3/0G3n4U4E1{0p0E0-0d4R4c4N3x4X0S4!4$4:3}4*2?4^4e1{0l0-0A4}4n3}4G3+0G3-0x3/4x3}4z5c4F0-1e5a4K2)4~1V5e4L3M4(2~3 4J5f1{460C491i3K3q1t2#1i3s1i0D3u5H2F2A0K1Q5C0k3s1o5q372s0p0M0b0K0F0x0M0O0v0-1a1c5i0X485p1t2`1p0|0~2n0y1 0y0H0q0j2m3/1S0b112u0E112L0z1R0y0c3!1v2`2P371X1I1K1M3E5E2)5/5B5T4o3*3,3.3:5p4%3750040g534V3P3*150r0f0K6C5r3j5t425v5n0-5.2%6x3x4{044-6w4_4f0-4i6K3%4q414t4v5k3H5m0(5o5l545g4H406O5/6:3@4P6(4;4q0W6.346U4`4+042@6Z6}6z527b6@2.6s586u6P6;0-4A6?6D6M045i1f7l6~3_7v566`744M6}5x5z0k6p5D5P5R5F0S0U0W04.

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

.128013f:Sd=4yr/opg2mcb1wR3ve l,P5)tikné;ua(_shq050e0w0D0K0E0y0N0x0p0y0K0N0N0f010D0E0l010406050N0J0o0o0K0i0h040d0k0y0J0*0k0G0x020K0o0l0I0x0t0w0@0i0P0J0w0N050j0;0?0^0`0/0l04051p1i1s0j1p0/0e0E0v0Y0!0$0(0O0E0m0O0y1G0O0D0-050T0q0y0w1B0#0%011F1H1J1H0D1P1R1N0D0i1q0D0O0Y0}0N0l0K0G0(0n011T1D010b0V0w0G150w1N1:1=1`1V1}1R200o22040a0x0A0i0k0l0k0N0E10120R1.0i0i0w0p2n1i240G1q0j1,2z1)1+1*1O0e260(1J0G1 2k1N1y1A0Z1U2J0E2L0G0k2P1N0l2s1q2x2z2%0:1;122R1{2W0i0@0y0-0r2w2+0.2*252-1V2/2;0-0n2^1=2`2x2I012 0K2=040u332y0/362}0(393b0g3e352+373k0-0B3n1t2#1i2P2C0e1+2H3i010p2X2c0Q1z1q2!0w2$2_3u3F0R3N2|1C1V0F0-0R0b3u3h3U0(0s0-0x3!3p3D0G0b0-0o2U0E0o0=3+3T2S010,040L3_2,3$380-1J0N0D0w40373}0C0c3n060x4g3*3#3{3W040E3Z1j2_4i3,420G0-1g0D0M0v0E0R493D3}3 4p342{413{4u041e0w1f4C424E4Q4K440E46484G2y4I4a0-0C4c3n4r3`1{0p0r0-030x0R0i0G0E0w0i0x0H0y0H2b0G0D4=1S0!0x45474e4h5a4+4J1{4l2s0D0J4@4*4#3-0-47584Z3S5d1V4S5q5l4t4V4X4T1{4b594h5w4k4v0W4Y2)4j5B0-4d5q4f5b4g5F5e0-5g5i0G5k5L2~0q3:2U5A5t0-4F5K4s4U045o5J3O5!0(5u5-4,2~5y5p5`5s5^4%0z5Z5.2.5%4^3@0o5)613~6b434M1f4P5v5@3|5+6e4L575=4H6k4b4(4e1i3Q3M3v6y0j3y1i0D3A6D2F2A0K1Q6A3y1o5r372s0o0M0b0K0F0w0M0O0u0-1a1c4N0X5O2)1v2`1p0|0~2n0x1 4|0p0i2m5i1S0b112u0E112L0y1R0x0c3*6+1x1z371X1I1K1M3K3w6*2)6x6O5m043;683^5q5c370k0-0f645{0(4l0!0o0q0e0K7w606f6p6e3}6)4q5T5|5:0S6q4!6s6m6j657O7I7V7x6l040C7F374l4n7(7l4w4y4A7R7k4R7U5 3q0-4N6i7^4D7@5?7W3j5}7;7N6c6u7q85014l0w5I7,4t5$7m5(7Z7G5_807!4L5;7J7 6r817H4W5~8m8k628e5/7n3?7p7}7?6d8j7_6g4O847T8H8F5/7Y8P5M7$872%0/0j7j6z2z6M3x0S0U0W04.

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

.128013f:6SFd=4yr/oTpg2mcb1wR37ve l,P5)tikné;ua(_shq050g0A0H0O0I0C0R0B0s0C0O0R0R0h010H0I0o010406050R0N0r0r0O0k0j040e0m0C0N0.0m0K0B020O0r0o0M0B0w0A0{0k0T0N0A0R050l0^0`0|0~0?0o04051t1m1w0l1t0?0g0I0z0$0(0*0,0S0I0p0S0C1K0S0H0;050X0t0C0A1F0)0+011J1L1N1L0H1T1V1R0H0k1u0H0S0$110R0o0O0K0,0q011X1H010b0Z0A0K190A1R1@1_1~1Z211V240r26040a0B0E0k0m0o0m0R0I14160V1=0k0k0A0s2r1m280K1u0l1:2D1-1/1.1S0g2a0,1N0K232o1R1C1E0%1Y2N0I2P0K0m2T1R0o2w1u2B2D2+0@1^162V1 2!0k0{0C0;0u2A2/0=2.292;1Z2?2^0;0q2|1_2~2B2M01330O2_040x372C0?3a310,3d3f0i3i392/3b3o0;0F3r3k3t3m3c0m2@3e0;0d3y2 2:1G323D34040y3r1x2)1m2T2G0g1/2L3B0s2#2g0U1D1u2(0A2*2}3R3#0V3-303L0,0J0;0V0b3R3l3@010v0;0B3}3A3 0K0b0;3#0K0.230H443?2W010:040P4f3K4h0K0;1N0R0H0A4m3b4j0D3r433~4o0;0z4v3B4j0G0c3y0B4L4A454h3_040I3|1n2}4N4g2=0;1k0H0Q0z0I0V4F3 4j4l4U383J3u4q0I4s4u4.2C4:4G0;4I4K4M504{3 4Q2w0H0N0k0K4z524P0s0;0f3e0R4^2+06514B1 4Q0A1N4T2+4W4n4Y044t4t4*4h4,5z5v4r5y4_3=5u1Z4H5a5m1Z0m0;0h0h5L4O5v4E5G5b1 4j4J5G5k504M5X1Z540W57595G5t3b0J5d040n0k1j4 4L5)3^4Z0!5i3.5M0,5Z5{5%5}015+56585S4X3249154c4b5C5J0;4-2-633c0;1i0A5`5W6p5B6v5T6f045E614/6w4}4y5/684p045V6o6z644}3I0l3:3,3S6U0l3V1m0H3X6Z2J2E0O1U6W3V1s5H3b2w0r0Q0b0O0J0A0Q0S0x0;1e1g6s0#5!2-1z2~1t10122r0B230B0L0s0k2q571W0b152y0I152P0C1V0B0c43741B1D3b1#1M1O1Q3*3T732-6T6.3B6K4a6i4e6I6p5O045R7N6O694q190t0g0O6d5I3n4=4@6k6P046H5s6J4D7)4i0;724V685=5e5g6D2C5:3B4Q4S7!4;044!4$4(7|7H4+6m7:6K6C7:5K7S6e5~8460827 5?5^6u7-6p805r7@6p6K6M8v7T7P5Q8m460;5x88686x6N8i6q6B4?5F8K7#7;040G8D4P5 5h8V5v7K0I4d8f8b6y8L6K6s8q627T8J8/8+7%8P8=8R4H7,8z8?6L8(8T6R7G6V2D6,3U0W0Y0!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

.128013f:S=d4yr/opg2mcb1hw3ve l,P5)tiknua(s_q050f0w0D0I0E0y0K0x0p0y0I0K0K0e010D0E0l010406050K0H0o0o0I0i0h040d0k0y0H0%0k0G050j0.0:0=0@0,0l040517101a0j170,0f0E0v0V0X0Z0#0s0E0m0s0y1o0s0D0*050Q0q0y0w1j0Y0!011n1p1r1p0D1x1z1v0D0i180D0s0V0`0K0l0I0G0#0n011B1l010b0S0w0G0I0o0w1v1U1W1#1D1(1z1+1-0*0a0x0A0i0k0l0k0K0E0}0G0x0O1S0i0i0w0p25101:0G180j1Q2i1N1P1O1w0f1=0#1r0G1*221v1g1i0W1C2s0E2u0G0k2y1v0l2b182g2i2M0-1V262A1$2F0i0;0y0*0r2f2Q0+2P1;2S1D2U2W0*0n2!1W2$2g2r012+0I2X040u2/2h0,2=2)0#2^2`0g2}2;2Q2?330*0B361b2K102y2l0f1P2q31010p2G1.183h193f2O112#053o0O2L383m0F0*0O0b3d301k1D0t0*0x3I3C3K320b0*0I0l0l1r0M0H0w3P2(3R010)040J3$2R3(0G0*3H3w2:2%3.2B3)0*0z363O3J3`3:041r0K0D3#3?2h3^2?3*0C0c36060x4h3 3Q3`3E040E3=2M4j3%410*0w450L0v0E0O3-4b0*3,483B4s2T0*44464B3m4c4e4F4g4i4S4a3D0*2b0D0H0i0 4F4r3_4I040p2b0w0i0L4K472O401$3*0J0C4f4T4?1D4m0w0T4;3x4}0#3*4P2M4R4S4h4U3(4m4X4Z4#4q5c4t4*0~0K4M3(4^5o5k4p534k4@4D5r4)464L4F5j5w3+5y2*4J0E45523@543{040C0C3}4$5D5H043V3X0E3Z5L495N5q5C5N425t5M5v1D3*5S5i5*0*5!3!5G555x5)5.325I5K5`5O5Q4`4Q103z0w2i2J693g1h3i2l2o2j0I1y6c0j3h0,6m0P0R0T04.

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

###(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

.128013f06S:d=4yr/Nopg2mcb1w937ve[ l8P5)ti]knua(_sh050g0A0I0O0J0D0R0C0s0D0O0R0R0h010I0J0o010406050R0N0r0r0O0k0j040e0n0D0N0-0n0M050l0@0_0{0}0=0o04051d161g0l1d0=0g0J0z0#0%0)0+0S0J0p0S0D1u0S0I0:050W0t0D0A1p0(0*011t1v1x1v0I1D1F1B0I0k1e0I0S0#100R0o0O0M0+0q011H1r010b0Y0A0M0O0r0A1B1!1$1+1J1.1F1;1?0:0a0C0F0k0n0o0n0R0J130M0C0U1Y0k0k0A0s2b161_0M1e0l1W2o1T1V1U1C0g1{0+1x0M1:281B1m1o0$1I2y0J2A0M0n2E1B0o2h1e2m2o2S0?1#2c2G1,2L0k0`0D0:0C0u2l2W0;2V1`2Y1J2!2$2(0q2+1$2-2m2x012=0O2%040C0x2_2n0=2|2:0+2 310C0i352{2W2}3b2(0G3f373h392~0n2#302(0d3m2.2X1q2;3r2?320y3w383z3a3B3t320E3F3o3H3q3s3c0w3N2/3P3j040u0c3U3y2H3Q3C0u2*172,1h2Q162E2r0g1V2w3p0s2M1@1e3;1f3/2U3,2`053`0U2R3O3%0L0:0U0b3f3x2}0v2(4e3G3%0M0b0:0A0R0I0Q0z0J0U4j481,0/040P4w3V4l0:0{0t2h4C3$4y0:0H0f3m0C4Q0C4f3p4a042h0I0N0k15422n4S4k2Z4F0k4H0A3f4(4x1J0n4h040J0R4/4T3P0L0s0:0m144.4$0;3n4D1,4V4c4J4g4i544|4l4n040p0O0N0s0S532U4)1J4z4B5e5q3a4+4-5b3p4z4N4P4R5f580:4X4Z4#2S4:572;5x4I5u4;0+4z0B5z3P0r0J0:3!5R5N5T0:0K3m564K1J590A4d5$5-0+4@4S5=3i5h0g252a5o3-5v015s5W4E044G5Q5p5S634M4O54064R5M5?014V5I4!4{620M5P6043625U651,5Y0:2^5`5A5)5+5F5.4b5:6w1J5^6J3a5h0k0O0s2J6s2n6F5(4A6M2~6r6Y5B6e2S6g5E626l0V5J6o6b6q674,69616b6v6B5X5Z3Y6#6D6f16450A2o2P743:1n3=2r2u2p0O1E770l3;0=7h0V0X0Z04.

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

.128013f:0S=d4yr/opg2mcb1hw3ve l+P5)tiknua(s_050g0x0E0J0F0z0L0y0q0z0J0L0L0f010E0F0m010406050L0I0p0p0J0j0i040e0l0z0I0%0l0H050k0.0:0=0@0,0m040517101a0k170,0g0F0w0V0X0Z0#0t0F0n0t0z1o0t0E0*050Q0r0z0x1j0Y0!011n1p1r1p0E1x1z1v0E0j180E0t0V0`0L0m0J0H0#0o011B1l010b0S0x0H0J0p0x1v1U1W1#1D1(1z1+1-0*0a0y0B0j0l0m0l0L0F0}0H0y0O1S0j0j0x0q25101:0H180k1Q2i1N1P1O1w0g1=0#1r0H1*221v1g1i0W1C2s0F2u0H0l2y1v0m2b182g2i2M0-1V262A1$2F0j0;0z0*0s2f2Q0+2P1;2S1D2U2W0*0o2!1W2$2g2r012+0J2X040v2/2h0,2=2)0#2^2`0h2}2;2Q2?330*0C361b2K102y2l0g1P2q31010q2G1.183h193f2O112#053o0O2L383m0G0*0O0b3d301k1D0u0*0y3I3C3K320b0*0Q0S1z3P2(3R010)040K3Y2R3!0H0*0=0r2b3)2?3$0D0c36060y3{3O3J2B013E040F3H3w2:3}3Q3 3,040x0L0E0M0w0F0O3;3m3$3(452h2%3*493-0j3/0x4j3!3?3^4n0+3|4C473Z3 412b0E0I0j0 4A4E4q1$0p0F0*0d3_4C4p2?410x0T4v4N4X4k0*4z2M3`4D3{4(3!4H0P4K4M2M4O2?4R2Y364`3m0l0*0A4~4:4r043V0z3X4A551$4l4w560n0J0I0q0t4$2O3~5d0*4m5n482T4s4u5f5p040D0D545o1D5104534%5D323U0R595m3x5J3#5q5x2*3F1 245O2:5c1D5e5b5Q4a3.3:5%5t5#0*5A3_103z0x2i2J5@3g1h3i2l2o2j0J1y5`0k3h0,640P5M0L04.

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

.128013f:0Sd=4yr/oxpg2mcb1w3ve l,+P5)tiknua(_sh050f0x0F0K0G0z0N0y0r0z0K0N0N0g010F0G0n010406050N0J0q0q0K0j0i040e0l0z0J0)0l0I050k0:0=0@0_0.0n040519121c0k190.0f0G0w0X0Z0#0%0O0G0o0O0z1q0O0F0,050S0s0z0x1l0!0$011p1r1t1r0F1z1B1x0F0j1a0F0O0X0|0N0n0K0I0%0p011D1n010b0U0x0I0K0q0x1x1W1Y1%1F1*1B1-1/0,0a0y0C0j0l0n0l0N0G0 0I0y0Q1U0j0j0x0r27121=0I1a0k1S2k1P1R1Q1y0f1@0%1t0I1,241x1i1k0Y1E2u0G2w0I0l2A1x0n2d1a2i2k2O0/1X282C1(2H0j0?0z0,0t2h2S0-2R1?2U1F2W2Y0,0p2$1Y2(2i2t012-0K2Z040v2;2j0.2@2+0%2`2|0h2 2?2S2^350,0D381d2M122A2n0f1R2s33010r2I1:1a3j1b3h2Q132%053q0Q2N3a3o0H0,0Q0b3f321m1F0u0,0y3K3E3M340b0,0O0K0~0x0J0j3R2*3T010+040L3%2T3)0I0,0@0s2d3.2^3+0E0c38060y403Q3L2D013G040G3J3y2=423S443;040x0N0F0M0w0G0Q3_3o3+3-4a2j2)3/4e3=0j3@0x4o3)3{3}4s0-414H4c3(44462d0F3#114F4J4v1(0q0G0,0d3~4H4u2^460x0V4A4R4#4p0,4E2O0y3 4I404,3)4M0R4P384S2^4V2!4}4^440l0,0B52432V0s0,0?0m4B444q5f2V3W3Y0F3!3$4F531(5h5p592,0,0o3Y0r0O4*2Q5u0%5s5C4d5j043?3^5t5H1F3{0E0A585N345k3Z3#5i5O0,4r5G4K5I0f21265B3z5D3*5!5Y5U5J4y5L5$4T5Z040E5}3~123B0x2k2L623i1j3k2n2q2l0K1A650k3j0.6f0R0T0V04.

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

.128013f:6SFd=4yr/oTpg2mcb1w3ve l,P5)tiknua(_sh050g0y0F0K0G0A0N0z0s0A0K0N0N0h010F0G0o010406050N0J0r0r0K0k0j040e0m0A0J0)0m0I050l0:0=0@0_0.0o040519121c0l190.0g0G0x0X0Z0#0%0O0G0p0O0A1q0O0F0,050S0t0A0y1l0!0$011p1r1t1r0F1z1B1x0F0k1a0F0O0X0|0N0o0K0I0%0q011D1n010b0U0y0I0K0r0y1x1W1Y1%1F1*1B1-1/0,0a0z0C0k0m0o0m0N0G0 0I0z0Q1U0k0k0y0s27121=0I1a0l1S2k1P1R1Q1y0g1@0%1t0I1,241x1i1k0Y1E2u0G2w0I0m2A1x0o2d1a2i2k2O0/1X282C1(2H0k0?0A0,0u2h2S0-2R1?2U1F2W2Y0,0q2$1Y2(2i2t012-0K2Z040w2;2j0.2@2+0%2`2|0i2 2?2S2^350,0D38313a332_0m2X2{0,0d381d2M122A2n0g1R2s3i0s2I1:1a3t1b3r2Q132%053z0Q2N3h1m1F0H0,0Q0b3p323O0%0v0,0z3U3N2D2_0b0,0K0o1X0k0)1,0F3#2*3W010+040L3=2T3@0I3*0k0t2d3|2^3_0B383!3V3%3 040x2{0y0J0k443i3_0E0c3f0z4p493$1(3Q040G3T3H2=4r3?4b0,0y0N0F0M0x0G0Q4j3@3_3{4y2j2)3}4C040@420y4L3%4l4n4P0-4q4(4A4S4t0,2d0F4h114$4*2^0H0s0,0f2{0N4X4$064(4R4@4D1t4x2O4?3i4c0k0K0s2F4~2Q4a1(4N4Y2V404W5k1F4l48523i0m0,0h0h5r5h2,0,4e1B4h5o0%3_4#2O504)4p5s3@4u4.4:5y4s3P4_040n0k0J5f2%5K5M5z0%5P0R5R4=5N4T3+3-3/0I3;4$5.5i0,4O5g5T340,0p0K0J0s0O5!2=5_5p5{5F2_5m435^5(3^0,0E475-6g4c5C4g4i6f5~6h040E5S4B1(0m3Y043k6w4+5A4U3,0@5=5@5}6x693`6b4c0g2126664Q6g5j6r6M5 4U416e6L6E5G6i6k57686!6o5E6Y6)6t6v4 123K0y2k2L6|3s1j3u2n2q2l0K1A6 0l3t0.790R0T0V04.

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

.128013f:6S0d=4yr/oxpg2mcb1w3ve l,P5)tiknua(_sh050g0y0F0K0G0A0N0z0s0A0K0N0N0h010F0G0o010406050N0J0r0r0K0k0j040e0m0A0J0)0m0I050l0:0=0@0_0.0o040519121c0l190.0g0G0x0X0Z0#0%0O0G0p0O0A1q0O0F0,050S0t0A0y1l0!0$011p1r1t1r0F1z1B1x0F0k1a0F0O0X0|0N0o0K0I0%0q011D1n010b0U0y0I0K0r0y1x1W1Y1%1F1*1B1-1/0,0a0z0C0k0m0o0m0N0G0 0I0z0Q1U0k0k0y0s27121=0I1a0l1S2k1P1R1Q1y0g1@0%1t0I1,241x1i1k0Y1E2u0G2w0I0m2A1x0o2d1a2i2k2O0/1X282C1(2H0k0?0A0,0u2h2S0-2R1?2U1F2W2Y0,0q2$1Y2(2i2t012-0K2Z040w2;2j0.2@2+0%2`2|0i2 2?2S2^350,0D38313a332_0m2X2{0,0d381d2M122A2n0g1R2s3i0s2I1:1a3t1b3r2Q132%053z0Q2N3h1m1F0H0,0Q0b3p323O0%0v0,0z3U3N2D2_0b0,0?0n0G0r0;3#2*3W010+040L3:2T3=0I0,0@0t2d3`2^3@0E0c3f0z483!3V3%3Q040G3T3H2=4a3$2V0,0y0N0F0M0x0G0Q423i3@3_4h2j2)3{3%3}043 414y3M3;3%44464H06494P4j4J1(4d2d0F0J0k114H4R4B1(0r0G0,0f47494A2^4d0y1t4g2O4#3b0,0S0U1B4u3=4w4~4C3~0k400y511(44384^3i0m0,0h0h5a4.3i4(2!571F3@4M2O4O4Q485i3=4U0R4X4Z4@5u52040k0K0s2F564H5B580,4x2Q4b4l4E544G5O4k5n0,0E4,5t5P3P0,4V5y5m0%505J5#340t3*0K0n5*3?5M5@4D5E5G2w5@5,5U4S2,53555 5X0B5h5.2_5;3,3.0r663^5`0,0p0K0J0s0O5I614$5W6h5-5V34645T3I6a440E684!5K2,5:043+6g5N6z6v6b5D5F5H6K6i5R656u625+67696N4D3+3-3/6W6r6Y6t6q4_040g21266p6M6X5^6-6^6+6O4F6@2=6F6,0E74743f123K0y2k2L7a3s1j3u2n2q2l0K1A7d0l3t0.7n0R0T0V04.

Crédits⚓︎

Frédéric Junier, Romain Janvier