Programmation fonctionnelle

Documents pareils
# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

Recherche dans un tableau

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

modules & compilation

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Machines virtuelles fonctionnelles (suite) Compilation ML Java

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Algorithmique et Programmation, IMA

Classes et Objets en Ocaml.

Conventions d écriture et outils de mise au point

Cours de Programmation 2

Cours 1 : La compilation

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Initiation à l algorithmique

Vérification de programmes et de preuves Première partie. décrire des algorithmes

Cours Informatique Master STEP

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Programme Compte bancaire (code)

1. Structure d'un programme FORTRAN 95

STAGE IREM 0- Premiers pas en Python

Programmation en Caml pour Débutants

Arbres binaires de recherche

Latitude N Longitude E Altitude 376 m RÉSUMÉ MENSUEL DU TEMPS DE JANVIER 2014

Introduction à la programmation concurrente

Corrigé des TD 1 à 5

Algorithmique & programmation

Algorithmique et programmation : les bases (VBA) Corrigé

KL5121. Pour activer des sorties en fonction de la position d'un codeur

Le prototype de la fonction main()

Paginer les données côté serveur, mettre en cache côté client

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

TP3 : Manipulation et implantation de systèmes de fichiers 1

SNT4U16 - Initiation à la programmation TD - Dynamique de POP III - Fichiers sources


Programmation C++ (débutant)/instructions for, while et do...while

Instructions pour mettre à jour un HFFv2 v1.x.yy v2.0.00

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

Licence Sciences et Technologies Examen janvier 2010

Cours de Systèmes d Exploitation

The new consumables catalogue from Medisoft is now updated. Please discover this full overview of all our consumables available to you.

Paris Airports - Web API Airports Path finding

Les arbres binaires de recherche

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

EES : Engineering Equation Solver Fiche récapitulative - Marie-Sophie Cabot

Application 1- VBA : Test de comportements d'investissements

Groupe symétrique. Chapitre II. 1 Définitions et généralités

.NET - Classe de Log

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

Plan. 1 Cycles de développement. 2 Méthodes agiles, principes généraux. 3 Comment se passe un Sprint?

Sub CalculAnnuite() Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt"

Guide d'installation rapide TFM-560X YO.13

Logiciel Libre Cours 2 Fondements: Programmation

Présentation du langage et premières fonctions

Initiation à la Programmation en Logique avec SISCtus Prolog

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Arguments d un programme

Plan du cours : Zippers. Des fonctions sur les listes avec position. Des fonctions sur les listes avec position

Perl Console. Votre compagnon pour développer en Perl. Les Journées du Perl , 17 novembre, Lyon. Alexis Sukrieh

Examen Médian - 1 heure 30

Gestion mémoire et Représentation intermédiaire

Une introduction rapide à Coq

R, Bonnes pratiques. Christophe Genolini

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Résolution du Problème du Voyageur de Commerce Métaheuristique

Pourquoi l apprentissage?

Cryptographie. Cours 3/8 - Chiffrement asymétrique

Paxton. ins Net2 desktop reader USB

Chapitre 11. Séries de Fourier. Nous supposons connues les formules donnant les coefficients de Fourier d une fonction 2 - périodique :

Théorie et Codage de l Information (IF01) exercices Paul Honeine Université de technologie de Troyes France

Introduction à JDBC. Accès aux bases de données en Java

Bases de programmation. Cours 5. Structurer les données

Chapitre 10. Les interfaces Comparable et Comparator 1

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Configurer la supervision pour une base MS SQL Server Viadéis Services

France SMS+ MT Premium Description

Analyse de sécurité de logiciels système par typage statique

Compilation (INF 564)

TP: Représentation des signaux binaires. 1 Simulation d un message binaire - Codage en ligne

Surveillance de Scripts LUA et de réception d EVENT. avec LoriotPro Extended & Broadcast Edition

Quick Start Guide Touch Tone Capture. Guide de démarrage rapide Saisie à l aide du clavier

Dans une agence de location immobilière...

TP 1. Prise en main du langage Python

Programmation avec des objets : Cours 7. Menu du jour

Chapitre 2 Devine mon nombre!

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

«Dire et écrire» pour réaliser une composition en travail collaboratif en géographie. Agnès Dullin, lycée J. Racine 20 rue du Rocher, Paris

TD3: tableaux avancées, première classe et chaînes

Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Propagation sur réseau statique et dynamique

Premiers Pas en Programmation Objet : les Classes et les Objets

Organigramme / Algorigramme Dossier élève 1 SI

1.6- Génération de nombres aléatoires

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Résoudre les problèmes PHP, les meilleures (et les pires) techniques

Initiation à la programmation en Python

Transcription:

Programmation fonctionnelle Cours 6 : la récursivité Licence 1 Année 2018 2019 Par N. VINCENT La longueur d'une liste Fonction qui calcule la longueur d'une liste : List.length L = [] L = [ 34 ] L = [3 ; 2 ; 5 ; 2 ; 4 ; 9 ; 7 ; 3 ] = h :: t h contribue de 1 t contribue de (longueur de t) Si longueur de t était connue long, on aurait 1 + long Hypothèse : savoir calculer la longueur de t Licence 1 - programmation fonctionnelle 2 La résolution d'un problème Classiquement Pour résoudre un problème - on applique une formule - on essaie de transformer le problème en des problèmes plus simples que l on sait résoudre Méthode récursive Il n est pas nécessaire de savoir résoudre explicitement le problème posé Licence 1 - programmation fonctionnelle 3 La résolution récursive Pour résoudre un problème - on transforme le problème P en un problème plus simple P - on doit faire le lien entre la solution de P et celle de P L'algo final de résolution de P comporte un appel à la fonction que l'on veut définir concernant le problème P Licence 1 - programmation fonctionnelle 4 Calcul de la longueur d une liste Une solution : la fonction List.length Algo - si la liste est vide, la longueur est 0 - sinon la longueur est 1 de plus que la longueur du reste de la liste L'algo comporte - Une solution dans un cas simple - un appel à la fonction que l'on veut définir dans un cas plus simple l = h::t Licence 1 - programmation fonctionnelle 5 La résolution d'un problème Actions et calculs simples Fonction qui teste tous les éléments d'une liste : List.for_all Algo - si la liste est vide le résultat est vrai - sinon le résultat est le cumul entre le résultat du test de l'élément de tête et le résultat de la fonction appliquée au reste Licence 1 - programmation fonctionnelle 6 1

Le principe de résolution On a cherché à décomposer le problème Une action simple pour résoudre le problème quand l'argument est simple Le même problème sur une donnée plus réduite C'est une méthode récursive (la fonction s appelle elle-même) On définit une fonction récursive #let rec f x =... Licence 1 - programmation fonctionnelle 7 Fonction récursive Schéma de base #let rec f x = Si condition sur x Alors résultat facile à calculer Sinon lien entre le résultat sur les données plus simples et le résultat sur x Les difficultés : - définir le cas simple (condition sur x résultat) - trouver le lien avec les cas plus simples ramenant au cas simple Licence 1 - programmation fonctionnelle 8 Longueur d'une liste L Exemple Liste dont la longueur est la plus petite Liste vide Problème plus simple que L (qui rapproche de la liste vide) L=h::t (longueur t < longueur L) Lien entre la longueur de L et longueur de t longueur L = 1 + longueur t Licence 1 - programmation fonctionnelle 9 Calculer la longueur d'une liste # let rec long l = if l = [] then 0 else 1 + long (List.tl l) ;; # long ['a' ; 'a' ; 'a'] ;; - : int = 3 # let rec long l = match l with [] -> 0 h::t -> 1 + long t ;; # long ['a' ; 'a' ; 'a'] ;; - : int = 3 Licence 1 - programmation fonctionnelle 10 Exemple Calculer la longueur d'une liste # let rec long l = match l with [] -> 0 h::t -> 1 + long t ;; long l = 1 + long [2 ; 3; 4] long [2 ; 3; 4] = 1 + long [3; 4] long [3; 4] = 1 + long [4] long [4] = 1 + long [] long [ ] = 0 l = 1 :: [2 ; 3; 4] long l = 4 long [2 ; 3; 4] = 3 long [3; 4] = 2 long [4] = 1 Licence 1 - programmation fonctionnelle 11 Liste paire # let p x = x mod 2 = 0 ;; val p : int -> bool = <fun> # let parite l = List.for_all p l ;; val parite : int list -> bool = <fun> # parite [2;3;2] ;; - : bool = false # parite [-2 ; 6 ; 2 ; 10] ;; - : bool = true # let par l = let p x = x mod 2 = 0 in List.for_all p l ;; val par : int list -> bool = <fun> # par [2;3;2] ;; - : bool = false # par [-2 ; 6 ; 2 ; 10] ;; - : bool = true Licence 1 - programmation fonctionnelle 12 2

Version récursive liste paire Liste vide Cas le plus simple Liste avec un élément Critère de simplicité Longueur de la liste Cas «plus simple» l = h::t l -> t Lien entre cas général et cas «plus simple» pair(l) = p(h) et pair(t) Licence 1 - programmation fonctionnelle 13 Version récursive liste paire pair(l) = p(h) et pair(t) # let p x = x mod 2 = 0 ;; val p : int -> bool = <fun> # let rec f l = if l = [] then true else match l with h::t -> p h && f t [] -> true ;; val f : int list -> bool = <fun> let rec f l = match l with [] -> true # f [2 ; 3 ; 2] ;; h::t -> p h && f t ;; - : bool = false # f [-2 ; 6 ; 2 ; 10] ;; Licence 1 - programmation fonctionnelle - : bool = true 14 Cas le plus simple Critère de simplicité 0 1 Entier le plus petit Cas «plus simple» n n-1 Lien entre cas général et cas «plus simple» n! = n * (n-1)! 2! = 2 Licence 1 - programmation fonctionnelle 15 n! = n (n-1)! 1! = 1 # let rec fact2 n = if n = 1 then 1 else n * fact2(n-1) ;; val fact2 : int -> int = <fun> # fact2 0 ;; # fact2 1 ;; # fact2 2 ;; # fact2 5 ;; 20 Stack overflow during evaluation (looping recursion?). Licence 1 - programmation fonctionnelle 16 # fact (-3) ;; # fact 1 ;; # fact 0 ;; # fact 2 ;; # fact 5 ;; 20 Stack overflow during evaluation (looping recursion?). Licence 1 - programmation fonctionnelle 17 # let rec fact n = assert (n >= 0) ; if n = 0 then 1 else n * fact(n-1) ;; # fact (-3) ;; # fact 1 ;; # fact 0 ;; # fact 2 ;; # fact 5 ;; 20 Exception: Assert_failure ("", 1, 17). Licence 1 - programmation fonctionnelle 18 3

fact 4 4*fact 3 Le processus de calcul 4*3*fact 2 4*3*2*fact 1 4*3*2*1*fact 0 4*3*2*1*1 On peut demander à voir la suite des appels durant l exécution Licence 1 - programmation fonctionnelle 19 Voir le processus de calcul # fact 4 ;; # #trace fact ;; fact is now traced. # #untrace fact ;; fact is no longer traced. # fact 4 ;; 4 fact <-- 4 fact <-- 3 fact 4 fact <-- 2 4*fact 3 fact <-- 1 fact <-- 0 fact --> 1 fact --> 1 fact --> 2 fact --> 6 4*3*2*1*1 fact --> 24 4 Licence 1 - programmation fonctionnelle 20 4*3*fact 2 4*3*2*fact 1 4*3*2*1*fact 0 Tracer une fonction Ce sont les appels qui sont tracés # let f x = x*x + 3 ;; val f : int -> int = <fun> # trace f ;; Error: Unbound value trace # #trace f ;; f is now traced. # f 4 ;; f <-- 4 f --> 19 9 # let g x = x * (x + 3) ;; val g : int -> int = <fun> # #trace g ;; g is now traced. # g 4 ;; g <-- 4 g --> 28 8 Licence 1 - programmation fonctionnelle 21 Les points importants Méthode récursive de résolution de problème Cas limite Critère pour arriver au cas limite Lien entre deux calculs Définition #let rec f x =... Licence 1 - programmation fonctionnelle 22 Fonction récursive Schéma de base #let rec f x = Si condition sur x Alors résultat facile à calculer Sinon lien entre le résultat sur les données plus simples et le résultat sur x Les difficultés : - définir le cas simple (condition sur x résultat) - trouver le lien avec les cas plus simples ramenant au cas simple Licence 1 - programmation fonctionnelle 23 Un petit exemple Une fonction qui calcule la somme de deux valeurs # let somme x y = x + y ;; val somme : int -> int -> int = <fun> Valeurs modifiées # let somme x y = f1 f1 f2 x = + f1 f2 x y + ;; f2 y ;; Error: val somme Unbound : 'a -> value 'b -> f1('a -> int) -> ('b -> int) -> int = <fun> # let f x a = a * x ;; val f : int -> int -> int = <fun> # let ff a x = a * x ;; val ff : int -> int -> int = <fun> par des fonctions paramétrées par des fonctions paramétrées x -> 3x ; x -> 3x+5 # let g x a b = a * x + b ;; val g : int -> int -> int -> int = <fun> # let gg a b x = a * x + b ;; val gg : int -> int -> int -> int = <fun> # let nvsom x y = somme x y# ff let 3 nvsom gg 3 5 ;; x y = somme x y (ff 3) (gg 3 5) ;; val nvsom : int -> int -> int = <fun> Error: This function is applied to too many arguments; maybe you forgot a `;' Licence 1 - programmation fonctionnelle 24 4

Exemple (suite) # let somme x y f1 f2 = f1 x + f2 y ;; val somme : 'a -> 'b -> ('a -> int) -> ('b -> int) -> int = <fun> # somme 23 54 ;; - : (int -> int) -> (int -> int) -> int = <fun> # let somme f1 f2 x y = f1 x + f2 y ;; val somme : ('a -> int) -> ('b -> int) -> 'a -> 'b -> int = <fun> # somme (ff 3) (gg 3 5) ;; - : int -> int -> int = <fun> Licence 1 - programmation fonctionnelle 25 5