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
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.
###
#--- HDR ---#bksl-nlbksl-nldef creerpy-undliste():bksl-nl return ()bksl-nlbksl-nldef cons(valeur, liste):bksl-nl return (valeur, liste)bksl-nlbksl-nldef tete(liste):bksl-nl return liste[0]bksl-nlbksl-nldef queue(liste):bksl-nl return liste[1]bksl-nlbksl-nldef estpy-undvide(liste):bksl-nl return liste == ()bksl-nl bksl-nlbksl-nl#--- HDR ---#bksl-nlbksl-nl# A vousbksl-nlbksl-nlbksl-nl# pour vérifier :bksl-nlprint(...)bksl-nlbksl-nlSolution
Compléter la fonction récursiveminimum 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.
def minimum(liste):bksl-nl if ...: # dernier élément de la listebksl-nl return ...bksl-nl else:bksl-nl return min(..., minimum(...))bksl-nlbksl-nlbksl-nl# Testsbksl-nlbksl-nlassert minimum(cons(4, cons(13, cons(1, cons(5, creerpy-undliste()))))) == 1bksl-nlbksl-nldef minimum(liste):bksl-nl if estpy-undvide(queue(liste)): # dernier élément de la listebksl-nl return tete(liste)bksl-nl else:bksl-nl return min(tete(liste), minimum(queue(liste)))bksl-nlbksl-nl
Compléter la fonction récursivecontient 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.
###
# Testsbksl-nlbksl-nlassert contient(cons(4, cons(13, cons(1, cons(5, creerpy-undliste())))), 8) is Falsebksl-nlassert contient(cons(4, cons(13, cons(1, cons(5, creerpy-undliste())))), 13) is Truebksl-nlassert contient(creerpy-undliste(), 13) is Falsebksl-nlbksl-nl# Autres testsbksl-nlbksl-nlassert contient(cons(4, cons(13, cons(1, cons(5, creerpy-undliste())))), 5) is Truebksl-nlassert contient(cons(4, cons(13, cons(1, cons(5, creerpy-undliste())))), 4) is Truebksl-nlbksl-nl5/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
Compléter la fonction récursiveappartient 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.
Compléter la fonction récursivemaximum 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.