IFT359 – Programmation fonctionnelle Thème #6 Appel terminaux 1.

Slides:



Advertisements
Présentations similaires
Explorer un espace d’états
Advertisements

Les fonctions A quoi ça sert ?
Sensibilisation à l’Algorithmique
Introduction à l’Algorithmique
Sensibilisation à l’Algorithmique et structure de données
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
Cours d'algorithmique 7 - Intranet 1 27 novembre 2006 Cours dAlgorithmique Dérécursion (début) : Équivalences entre programmes récursifs et programmes.
CSI3525: Concepts des Langages de Programmation Notes # 5: Langages de Programmation Fonctionelle I: Introduction au Scheme.
ALGORITHMES RECURSIFS
Un langage de programmation fonctionnelle
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
OCaml - Les listes L3 MI.
Récursivité.
Dérécursivation Dérécursiver, c’est transformer un algorithme récursif en un algorithme équivalent ne contenant pas d’appels récursifs. Récursivité terminale.
Analyse lexicale Généralités Expressions rationnelles Automates finis
Programmation fonctionnelle Le langage LISP
Structures de données IFT-2000
P. Van Roy, LINF LINF1251: Algorithmes sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL
Programmation fonctionnelle

Architecture et technologie des ordinateurs II
1 La récursion. Nous avons vu qu'un programme est constitué d'un ensemble de fonctions. Il est possible pour une fonction donnée d'appeler une autre fonction.
CSI2520 Le langage Scheme (2) Un langage de programmation fonctionnelle.
III. Récursivité Principe et exemples
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
PHP 2° PARTIE : FONCTIONS ET FORMULAIRE

Le langage C Structures de données
Algo-Prog en Ada TD1 2 MIC Romaric GUILLERM
LES PILES ET FILES.
CSI2520  cdr vers le bas, cons vers le haut (define (traite-liste L) (if (null? L) () (cons (traite (car L)) (traite-liste (cdr L)))))
CSI2520  Cette fonction permet d’attribuer une valeur à une variable (set! nombre (+ 3 4)) (set! nombre (+ 1 nombre)) En SCHEME, les fonctions dont le.
Arbres binaires et tables de hachage
Le langage Racket (Lisp)
Méthodes et outils de conception Introduction à la programmation Paramètre de retour Appel d’une fonction Portée des variables Définition Pourquoi les.
Évaluation et application des fonctions Let f = function x -> ( function y -> x+y );; Type :int -> (int ->int) int -> int ->int f int.
Module : Pages Web Dynamiques (Production Électronique Avancée)
CSI2520 (map abs ‘( )) ( ) (map (lambda (x y) (* x y)) ‘( ) ‘( )) ( )  Permet d’appliquer une fonction aux.
La Récursivité.
Pthread Ordonnancement. #define _MULTI_THREADED #include #ifndef _CHECK_H #define _CHECK_H /* headers used by a majority of the example program */ #include.
La récursivité Mireille Goud HEG Vd AlgSD - Résurisivité.
CPI/BTS 2 Algorithmique & Programmation La récursivité Algo – Prog CPI/BTS2 – M. Dravet – 14/09/2003 Dernière modification: 14/09/2003.
Écrire des fonctions, max et min, qui calculent le maximum, et le minimum de deux éléments x et y. Exercice 1. max (min) : fonction qui prend deux valeurs,
Patricia Renault UPMC 2005/2006
Structures de données IFT-2000
La récursivité.
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département d’informatique et de génie logiciel Édition Septembre 2009.
MAXIMUM ET MINIMUM D’UNE FONCTION
Développement d’application avec base de données Semaine 3 : Modifications avec Entité Framework Automne 2015.
Formation Achats – MM Intégration avec FI. Introduction.
Introduction à la programmation
Chap.V RSA. I. Rappels Mathématiques La congruence Définition 1 a et b sont congrus modulo n s’ils ont même reste par la division par n. On note a≡b[n]
I.T.E.E.M de BEAULIEU Enseignante : Mme RECHID Automates Programmables Industriels ( ITEEM 2004 ) CHAPITRE 3 Programmation d'un automate Le langage de.
Utilisation des composants Guillaume PHILIPPON. Sommaire Fonctionnement des composants Comprendre le fonctionnement d’un composant Les bonnes pratiques.
IFT359 – Programmation fonctionnelle Thème 07 Fermeture, affectation ou monades 1.
Informatique 1A Langage C 6 ème séance 1. Objectifs de la séance 6  Allocation dynamique de mémoire  Application à la création de tableaux 2.
Informatique 2A Langage C 3 ème séance.
IFT359 – Programmation fonctionnelle Thème #8 Création de nouvelles formes syntaxiques 1.
MaillageCondition aux limites. Chargement. Exécution et visualisation des résultats La pièce Maillage grossier Maillage grossier avec transition automatique.
IFT359 – Programmation fonctionnelle Thème #10 Évaluation par environnement et évaluateur méta-circulaire 1.
Cours de Langage C Récursivité. Objectifs de la séance 11 Connaître la récursivité. Mesurer un temps d’exécution. 2.
Seconde 8 Module 12 M. FELT 08/12/ Module 12: Algorithmique #3  Objectif:  Instruction conditionnelle 2.
Chapitre 4: Variation dans le temps  Les données : audience totale en milliers (tableau 4.1, p. 47, extrait) o Origine : enquête sur les habitudes d’écoute.
IFT359 – Programmation fonctionnelle exercice backquote, unquote, unquote-splicing 1.
IFT359 – Programmation fonctionnelle Thème 02 B partie A introduction au langage fonctionnel choisi 1.
POWER QUERY Les FONCTIONS.
Session 1 6 mars 2017 Plateforme ICONICS Justine Guégan
Session 1 31 mai 2017 Plateforme ICONICS Justine Guégan
Programmation Impérative II
Global Challenge Capteur de nuit Leçon 2.
Transcription de la présentation:

IFT359 – Programmation fonctionnelle Thème #6 Appel terminaux 1

Récursivité directe/indirecte (define f (λ (x) (if (> x 10) #t (g x)))) (define g (λ (n) (if (> n 5) (f (+ n 1)) (g (+ n 1))))) Récursivité directe Récursivité indirecte (define fact (λ (n) (if (= n 0) 1 (* n (fact (- n 1)))))) 2

Appel terminal (tail call) Récursivité terminale (tail recursive) (fact 5) >(fact 5) > (fact 4) > >(fact 3) > > (fact 2) > > >(fact 1) > > > (fact 0) < < < 1 < < 2 < <6 < 24 <120 ->120 (define fact (λ (n) (if (= n 0) 1 (* n (fact (- n 1)))))) Observez la trace de (fact 5) 3

Appel terminal (tail call) Récursivité terminale (tail recursive) (define drop (λ (n lst) (if (= n 0) lst (drop (sub1 n) (cdr lst))))) (drop 3 '(a b c d e)) >(drop 3 (a b c d e)) >(drop 2 (b c d e)) >(drop 1 (c d e)) >(drop 0 (d e)) <(d e) ->(d e) 4

Appel terminal (tail call) Récursivité terminale (tail recursive) (define fact (λ (n) (if (= n 0) 1 (* n (fact (- n 1)))))) (define drop (λ (n lst) (if (= n 0) lst (drop (sub1 n) (cdr lst))))) Dernier appel d’une procédure Il peut y en avoir plusieurs (e.g. cond ) Si c’est un appel récursif direct, on parle de récursivité terminale Peut être optimisé par le compilateur En Scheme (DrRacket), garanti par la spécification Une procédure récursive terminale est grosso modo équivalente à une boucle en C Exécution d’une λ = « GOTO avec paramètres » 5

Récursivité terminale : Exemple (define fact-iter (λ (n) (let iter ([res 1] [k n]) (if (> k 0) (iter (* k res) (sub1 k)) res)))) (define reverse-iter (λ (lst) (let iter ([reste lst] [res '()]) (if (null? reste res (iter (cdr reste) (cons (car reste) res)))))) 6

Récursivité terminale : Exemple (define length-iter (λ (lst) (letrec [iter (λ (reste res) (cond [(null? reste) res] [else (iter (cdr reste) (add1 res))]))]) (iter lst 0)))) 7

Application de la récursivité : algorithme de type « diviser pour reigner » (define quicksort (λ (lst) (if (or (null? lst) (null? (cdr lst))) lst (let* ([pivot (car lst)] [reste (cdr lst)] [before (filter (curryr <= pivot) reste)] [after (filter (curryr > pivot) reste)]) (append (quicksort before) (cons pivot (quicksort after))))))) Que pensez-vous du Quicksort ? 8

Application de la récursivité : Fouille (define binsearch (λ (vect value) (let search ([min 0] [max (vector-length vect)]) (if (or (> 0 min) ( max (vector-length vect)) #f (let ([mid (+ min (quotient (- max min) 2))]) (cond [(> (vector-ref vect mid) value) (search min (sub1 mid))] [(< (vector-ref vect mid) value) (search (add1 mid) max)] [else mid])))))) Que pensez-vous de binsearch ? 9

Application de la récursivité : Automate Scanner pour c[a|d] + r Exercice : Créer une procédure cadr-scanner qui prend en entrée une liste et qui retourne #t si cette liste peut être produire par cet automate sinon #f. 10

Application de la récursivité : Automate (define cadr-scanner (λ (i) (letrec ([C (λ (i) (cond [(null? i) #f] [(eq? (car i) 'c) (AD (cdr i))] [else #f]))] [AD (λ (i) (cond [(null? i) #f] [(or (eq? (car i) 'a) (eq? (car i) 'd)) (AD (cdr i))] [(eq? (car i) 'r) (R (cdr i))] [else #f]))] [R (λ (i) (cond [(null? i) #t] [else #f]))]) (C i)))) 11

Application de la récursivité : Arbre et graphe (define flatten-iter (λ (tree) (let loop ([tree tree] [stack '()] [l '()]) (cond [(and (null? tree) (null? stack)) (reverse l)] [(null? tree) (loop (car stack) (cdr stack) l)] [(and (atom? tree) (null? stack)) (reverse (cons tree l))] [(atom? tree) (loop (car stack) (cdr stack)(cons tree l))] [else (loop (car tree) (append (cdr tree) stack) l)])))) Est-ce plus efficace que la récursivité naturelle ? 12

Application de la récursivité : Fractale (define sierpinski (λ (a b c) (unless (too-small? a b c) (let [a-b (mid-point a b)] [b-c (mid-point b c)] [c-a (mid-point a c)]) (draw-triangle a b c) (sierpinski a a-b c-a) (sierpinski b a-b b-c) (sierpinski c c-a b-c))))) 13

La fonction d’Ackerman (define A (λ (m n) (cond [(= m 0) (+ n 1)] [(and (> m 0) (= n 0)) (A (- m 1) 1)] [(and (> m 0) (> n 0)) (A (- m 1) (A m (- n 1)))]))) Elle explose très rapidement, mais elle est totale (en théorie) A(4, 2) =

Mémoization Quand une (f n) est définie par rapport aux valeurs de (f (- n1)), …, (f (- n k)) –Fibonnaci (version co-récursive) –Ackerman (tester avec m=3, n=12) On sauvegarde les anciennes valeurs –On peut utiliser les hashtable Plus efficace qu’une liste –On forme la clé avec une liste contenant tous les arguments 15

Mémoization (define memoize (λ (f) (let ([table (make-hash)]) (λ args (cond [(hash-has-key? table args) (hash-ref table args)] [else (let ([result (apply f args)]) (hash-set! table args result) result)]))))) 16

memoizedAckerman (define mA (memoize (λ (m n) (cond [(= m 0) (+ n 1)] [(and (> m 0) (= n 0)) (mA (- m 1) 1)] [(and (> m 0) (> n 0)) (mA (- m 1) (mA m (- n 1)))])))) On peut encore faire mieux avec les macros (define A (λ (m n) (cond [(= m 0) (+ n 1)] [(and (> m 0) (= n 0)) (A (- m 1) 1)] [(and (> m 0) (> n 0)) (A (- m 1) (A m (- n 1)))]))) 17

foldl-iter (define foldl-iter (λ (proc init lst) (let iter ([reste lst] [res init]) (if (null? reste) res (iter (cdr reste) (proc (car reste) res)))))) brillant ? 18

foldl-iter (define foldl (λ (fn ini liste) (if (null? liste) ini (foldl fn (fn (car liste) ini) (cdr liste))))) brillant ? bof! c’était un bon exercice sur les named let Essayez de faire foldr-iter sans faire de reverse (directement ou indirectement) 19