12/10/2004 P. Van Roy, InfoT4, S4 1 Informatique T4 (FSAC1450) Récursion sur les Entiers Peter Van Roy Département dIngénierie Informatique, UCL

Slides:



Advertisements
Présentations similaires
La Méthode de Simplexe Standardisation
Advertisements

La boucle for : init7.c et init71.c
Portée des variables VBA & Excel
Fonctions & procédures
Spécification et qualité du logiciel
8. Les tableaux P. Costamagna – ISEN N1.
Introduction à la programmation (420-PK2-SL) cours 15 Gestion des applications Technologie de linformation (LEA.BW)
CSI3525: Concepts des Langages de Programmation Notes # 5: Langages de Programmation Fonctionelle I: Introduction au Scheme.
FSAB1402: Informatique 2 Techniques de Programmation Orientée Objet
Informatique T4 (FSAC1450) Introduction et Concepts de Base
18/10/2004 P. Van Roy, InfoT4, S5 1 Informatique T4 Solutions au Test du 18 octobre Peter Van Roy Département dIngénierie Informatique, UCL
Structures de données linéaires
Introduction à la programmation (420-PK2-SL) cours 12 Gestion des applications Technologie de linformation (LEA.BW)
9/11/2004 P. Van Roy, InfoT4, S8 1 Informatique T4 (FSAC1450) LEtat et lAbstraction de Données Peter Van Roy Département dIngénierie Informatique, UCL.
Les méthodes en java Une méthode est un regroupement d’instructions ayant pour but de faire un traitement bien précis. Une méthode pour être utilisée.
Démarche de résolution de problèmes
© 2007 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 La Concurrence Déclarative Peter Van Roy Département dIngénierie Informatique, UCL
Algorithmique et Programmation
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java et les Exceptions Peter Van Roy Département dIngénierie Informatique,
© 2007 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Sémantique Formelle Peter Van Roy Département dIngénierie Informatique, UCL
© 2005 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 LEtat et lAbstraction de Données Peter Van Roy Département dIngénierie Informatique,
© 2005 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Algorithmes sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL
2/11/2004 P. Van Roy, InfoT4, S7 1 Informatique T4 (FSAC1450) Sémantique Peter Van Roy Département dIngénierie Informatique, UCL
© 2007 P. Van Roy. All rights reserved. 1 FSAB 1402: Informatique 2 Récursion sur les Entiers Peter Van Roy Département dIngénierie Informatique, UCL
Les pointeurs Modes d’adressage de variables. Définition d’un pointeur. Opérateurs de base. Opérations élémentaires. Pointeurs et tableaux. Pointeurs et.
Expressions régulières et hash tables
© 2007 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Récursion sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL
© 2007 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Enregistrements et Arbres Peter Van Roy Département dIngénierie Informatique, UCL
© 2007 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Programmer avec des Types Abstraits Peter Van Roy Département dIngénierie Informatique,
FSAB1402: Informatique 2 L’État et l’Abstraction de Données
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Programmer avec lEtat Peter Van Roy Département dIngénierie Informatique, UCL
P. Van Roy, LINF LINF1251: Algorithmes sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL
© 2005 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Enregistrements et Arbres Peter Van Roy Département dIngénierie Informatique, UCL
29/9/2005 © 2005 P. Van Roy. All rights reserved. 1 FSAB 1402: Informatique 2 Récursion sur les Entiers Peter Van Roy Département dIngénierie Informatique,
26/10/2004 P. Van Roy, InfoT4, S6 1 Informatique T4 (FSAC1450) Récursion sur les Listes Peter Van Roy Département dIngénierie Informatique, UCL
Peter Van Roy Département d’Ingénierie Informatique, UCL
P. Van Roy, LINF1251 LINF1251: Le Langage Java Peter Van Roy Département dIngénierie Informatique, UCL
P. Van Roy, LINF LINF1251: Enregistrements et Arbres Peter Van Roy Département dIngénierie Informatique, UCL
CSI3525: Concepts des Languages de Programmation
LIFI-Java 2004 Séance du Jeudi 9 sept. Cours 1. La notion de langage Décrire une tâche à effectuer –programme Écrire à un haut niveau –facile pour lutilisateur.
Chapitre 3 Syntaxe et sémantique.
Partie II Sémantique.
Sémantique dénotationnelle
Structures de données IFT-2000 Abder Alikacem La récursivité Semaine 5 Département dinformatique et de génie logiciel Édition Septembre 2009.
P. Van Roy, LINF LINF1251: Sémantique Formelle Peter Van Roy Département d’Ingénierie Informatique, UCL
Procédures et fonctions
P. Van Roy, LINF LINF1251: LEtat et lAbstraction de Données Peter Van Roy Département dIngénierie Informatique, UCL
Structures de données IFT-2000 Abder Alikacem La récursivité Département d’informatique et de génie logiciel Édition Septembre 2009.
RAPPEL Qu’est ce qu’une structure de contrôle itérative ?
Un survol du language C.
Programmation linéaire en nombres entiers
© 2005 P. Van Roy. All rights reserved. FSAB1402: Informatique 2 Le Langage Java Peter Van Roy Département d’Ingénierie Informatique, UCL
D.E ZEGOUR Ecole Supérieure d’Informatique. Problèmes de décision Concepts de base Expressions régulières Notation particulière pour exprimer certaines.
Le langage Racket (Lisp)
Introduction au langage C Fonctions et Procédures
3.1 DÉTERMINANTS Cours 5.
Cours LCS N°4 Présenté par Mr: LALLALI
LINF 1251: Introduction à l’Algorithmique et la Programmation II
2005/2006 Structures de Données Introduction à la complexité des algorithmes.
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.
6/10/2005 © 2005 P. Van Roy. All rights reserved. 1 FSAB1402: Informatique 2 Récursion sur les Listes Peter Van Roy Département d’Ingénierie Informatique,
LINF 1251: Récursion sur les Listes
8PRO107 Éléments de programmation Les tableaux. Étude de cas 1 Description du problème : Lire une liste d’entiers et l’afficher d’abord dans le même ordre.
Scripts et fonctions Instructions de contrôle
Algorithmique Boucles et Itérations
Introduction à l’Informatique chap 3 Licence SPI Mme Delmotte.
Chap. 3 Récursion et induction. Les définitions par récurrence consistent à construire des objets finis, à partir d'autres, selon certaines règles. Les.
L ES INSTRUCTIONS DE L ECTURE, E CRITURE ET A FFECTATION Réalisé par : OUZEGGANE Redouane Département de Technologie Faculté de Technologie – Université.
IFT359 – Programmation fonctionnelle Thème 07 Fermeture, affectation ou monades 1.
Transcription de la présentation:

12/10/2004 P. Van Roy, InfoT4, S4 1 Informatique T4 (FSAC1450) Récursion sur les Entiers Peter Van Roy Département dIngénierie Informatique, UCL

12/10/2004P. Van Roy, InfoT4, S42 Ce quon va voir aujourdhui Test du 18 octobre Résumé du premier cours Récursion sur les entiers Introduction aux listes

12/10/2004P. Van Roy, InfoT4, S43 Test du 18 octobre Tout ce quon a vu pendant les deux premières semaines Cours magistraux (transparents, livre 1.1, 1.2, 1.3, 2.1, 2.3, 2.4.1, 3.2, 3.3, annexe A) Travaux pratiques Théorie et pratique Définitions précises des concepts Pratique de lécriture des programmes Questions ouvertes Une heure pour répondre; deux heures en tout partagées avec lexamen de mathématiques

12/10/2004 P. Van Roy, InfoT4, S4 4 Résumé du premier cours

12/10/2004P. Van Roy, InfoT4, S45 Une question de portée… local P Q in proc {P} {Browse 100} end proc {Q} {P} end local P in proc {P} {Browse 200} end {Q} end Quest-ce qui est affiché par ce petit programme?

12/10/2004P. Van Roy, InfoT4, S46 Procédures et portée lexicale local P Q in proc {P} {Browse 100} end proc {Q} {P} end local P in proc {P} {Browse 200} end {Q} end Une procédure ou une fonction se souvient toujours de lendroit de sa naissance Donc, la définition de Q utilise la première définition de P Portée lexicale: dans la définition de Q, de quel P sagit-il? La définition de P à côté de lappel de Q nest pas utilisée

12/10/2004P. Van Roy, InfoT4, S47 Un autre raisonnement… Souvenez-vous de la définition du modèle déclaratif Un programme qui marche aujourdhui marchera demain Un programme est un ensemble de fonctions Chaque fonction ne change jamais son comportement, tout comme chaque variable ne change jamais son affectation Donc, lappel de Q donnera toujours le même résultat Comment cela est-il réalisé? Avec lenvironnement contextuel

12/10/2004P. Van Roy, InfoT4, S48 Identificateurs et variables Souvenez-vous des deux mondes: le programmeur et lordinateur Un identificateur est un nom textuel, fait pour le programmeur Une variable (en mêmoire) est ce quutilise lordinateur pour faire ses calculs Une variable nest jamais vu directement par le programmeur, mais indirectement par lintermédiaire dun identificateur Le rôle clé de lenvironnement Un même identificateur peut désigner des variables différentes à des endroits différents du programme

12/10/2004P. Van Roy, InfoT4, S49 Fonctions, procédures et le langage noyau Souvenez-vous: comment est-ce quon peut comprendre un langage riche, avec un grand nombre doutils pour le programmeur? On utilise un langage simple, le langage noyau Le langage riche est traduit vers le langage noyau Exemple: dans notre langage noyau, il ny a que de procédures, pas de fonctions Une fonction est traduite vers une procédure avec un argument de plus fun {Inc X} X+1 end devient proc {Inc X Y} Y=X+1 end A={Inc 10} devient {Inc 10 A}

12/10/2004 P. Van Roy, InfoT4, S4 10 Récursion sur les entiers

12/10/2004P. Van Roy, InfoT4, S411 Récursion Idée: résoudre un grand problème en utilisant des solutions aux problèmes plus petits Il faut savoir ranger les solutions selon la taille du problème quils résolvent Pour aller de Barbe 91 à Louvain-la-Neuve au restaurant Hard Rock Café à Stockholm Découpe en de problèmes plus petits et solubles: voyage de Louvain-la-Neuve à Zaventem (train), voyage Bruxelles- Stockholm (avion), voyage aéroport Stockholm-centre ville (train), voyage au Hard Rock Café (métro) Il faut savoir résoudre les problèmes les plus petits directement! (train, métro, avion, voiture)

12/10/2004P. Van Roy, InfoT4, S412 Exemple: calcul de factorielle declare fun {Fact N} if N==0 then 1 else N * {Fact N-1} end end Grand problème: {Fact N} Problème plus petit: {Fact N-1} Solution directe: {Fact 0} = 1

12/10/2004P. Van Roy, InfoT4, S413 Une autre factorielle En utilisant un invariant: n! = i! * a On commence avec i=n et a=1 On réduit i et on augmente a, tout en gardant vrai linvariant Quand i=0 cest fini et le résultat cest a Exemple avec n=4: 4! = 4! * 1 4! = 3! * 4 4! = 2! * 12 4! = 1! * 24 4! = 0! * 24

12/10/2004P. Van Roy, InfoT4, S414 Le programme declare fun {Fact2 I A} if I==0 then A else {Fact2 I-1 I*A} end end declare F={Fact2 4 1} {Browse F}

12/10/2004P. Van Roy, InfoT4, S415 Linvariant Voici linvariant quon a utilisé: n! = i! * a Un invariant est une formule logique qui est vrai à chaque appel récursif pour les arguments de cet appel Linvariant contient à la fois des informations globales (n) et locales (les arguments i et a)

12/10/2004P. Van Roy, InfoT4, S416 Les accumulateurs Dans Fact2, on accumule le résultat petit à petit dans A Largument A de Fact2 est donc appelé un accumulateur Dans la programmation déclarative, on utilise souvent des invariants et des accumulateurs Les invariants sont les mêmes quon utilise dans les boucles des langages impératifs comme Java (Notez que Fact2 est aussi une fonction récursive: la programmation avec accumulateurs est un cas particulier de la programmation récursive)

12/10/2004P. Van Roy, InfoT4, S417 Comparaison de Fact et Fact2 Quand on regarde lappel récursif dans les deux cas, on voit une différence: Dans Fact: N*{Fact N-1} Dans Fact2: {Fact2 I-1 I*A} Dans Fact, après lappel récursif on doit revenir pour faire la multiplication avec N Dans Fact2, on ne revient pas après lappel récursif

12/10/2004P. Van Roy, InfoT4, S418 Limportance des accumulateurs Quand on regarde lappel récursif dans les deux cas, on voit une différence: Dans Fact: N*{Fact N-1} Dans Fact2: {Fact2 I-1 I*A} Cest une grande différence! Pendant lexécution, Fact doit garder en mémoire des informations sur tous les appels, jusquà la fin de tous les appels récursifs Fact2 ne doit garder en mémoire que lappel actuellement en cours, ce qui est une économie importante Pour lefficacité, lappel récursif doit être le dernier appel! Alors la taille de mémoire sera constante Cest pourquoi les accumulateurs sont importants (On rendra cette intuition plus exacte quand on verra la sémantique)

12/10/2004P. Van Roy, InfoT4, S419 La racine carrée avec la méthode itérative de Newton On va utiliser une méthode itérative, la méthode de Newton, pour calculer la racine carrée Cette méthode est basée sur lobservation que si g est une approximation de sqrt(x), alors la moyenne entre g et x/g est une meilleure approximation: g = (g + x/g)/2

12/10/2004P. Van Roy, InfoT4, S420 Pourquoi la méthode de Newton marche Pour vérifier que lapproximation améliorée est meilleure, calculons lerreur e: e = g - sqrt(x) Alors: e = g - sqrt(x) = (g + x/g)/2 - sqrt(x) = e 2 /2g Si on suppose que e 2 /2g 0 Cest donc toujours vrai que lerreur diminue!

12/10/2004P. Van Roy, InfoT4, S421 Itération générique Nous allons utiliser un itérateur générique: fun {Iterate Si} if {IsDone Si} then Si else local Sj in Sj={Transform Si} {Iterate Sj} end end end Cet itérateur utilise un accumulateur Si Il faut remplir IsDone et Transform

12/10/2004P. Van Roy, InfoT4, S422 Lamélioration dune approximation (Transform) fun {Transform Guess} (Guess + X/Guess) / 2.0 end Attention: X nest pas un argument de Transform! X est un identificateur libre dans Transform qui doit être défini dans le contexte de Transform (Petite remarque: X, Guess et 2.0 sont tous des nombres en virgule flottante. Pour garder lexactitude des entiers, il ny a aucune conversion automatique avec les entiers.)

12/10/2004P. Van Roy, InfoT4, S423 La fin de litération (IsDone) fun {IsDone Guess} {Abs (X-Guess*Guess)}/X < end De nouveau, X est un identificateur libre dans IsDone Lerreur relative est câblée dans la routine; on peut en faire un paramètre (exercice!) Attention: X doit être différent de 0.0!

12/10/2004P. Van Roy, InfoT4, S424 Définition complète fun {NewtonSqrt X} fun {Transform Guess} (Guess + X/Guess)/2.0 end fun {IsDone Guess} {Abs X-Guess*Guess}/X < end fun {Iterate Guess} if {IsDone Guess} then Guess else {Iterate {Transform Guess}} end end in {Iterate 1.0} end

12/10/2004P. Van Roy, InfoT4, S425 Spécification de NewtonSqrt S={NewtonSqrt X} satisfait: Les arguments S et X sont des nombres en virgule flottante; lentrée X et la sortie S sont positifs (>0.0) La relation entre eux est: |x-s*s|< Exercice: étendre la fonction pour satisfaire à une spécification où X=0.0 est permis

12/10/2004P. Van Roy, InfoT4, S426 Structure de NewtonSqrt Vous remarquez que Transform, IsDone et Iterate sont des fonctions locales à NewtonSqrt Elles sont cachées de lextérieur Transform et IsDone sont dans la portée de X, elles connaissent donc la valeur appropriée de X Dautres définitions sont possibles (voir le livre)! Par exemple, vous pouvez mettre leurs définitions à lextérieur de NewtonSqrt (exercice!) Avec local … end, vous pouvez quand même cacher ces définitions du reste du programme (comment?)

12/10/2004P. Van Roy, InfoT4, S427 Une récursion un peu plus compliquée: la puissance Nous allons définir une fonction {Pow X N} qui calcule X N (N0) avec une méthode efficace Dabord, une méthode naïve: fun {Pow X N} if N==0 then 1.0 else X*{Pow X N-1} end end Cette définition est très inefficace!

12/10/2004P. Van Roy, InfoT4, S428 Définition inductive de X N La définition inductive est x 0 =1 x 2n+1 =x * x 2n x 2n =y 2 où y=x n (n>0) Nous pouvons programmer cette définition tout de suite! Notez que cette définition inductive est aussi une spécification Cest une définition purement mathématique Plus élaborée, certes, que la spécification naïve, mais quand même une spécification

12/10/2004P. Van Roy, InfoT4, S429 Définition de {Pow X N} fun {Pow X N} if N==0 then 1.0 elseif N mod 2 == 1 then X*{Pow X (N-1)} else Y in Y={Pow X (N div 2)} Y*Y end

12/10/2004P. Van Roy, InfoT4, S430 Pow avec un accumulateur La définition précédente nutilise pas daccumulateur Est-ce quon peut faire une autre définition avec un accumulateur? Il faut dabord un invariant! Dans linvariant, une partie accumulera le résultat et une autre partie tendra à disparaître Quest-ce qui est accumulé dans Pow?

12/10/2004P. Van Roy, InfoT4, S431 Pow avec un accumulateur Voici un invariant: x n = y i * a Cet invariant peut être représenté par un triplet (y,i,a) Initialement: (y,i,a) = (x,n,1.0) Il y a deux types ditérations: (y,i,a) devient (y*y,i/2,a) (si i est pair) (y,i,a) devient (y,i-1,y*a) (si i est impair) Quand i=0 alors le résultat est a

12/10/2004P. Van Roy, InfoT4, S432 Définition de {Pow X N} avec un accumulateur fun {Pow2 X N} fun {PowLoop Y I A} if I==0 then A elseif I mod 2 == 0 then {PowLoop Y*Y (I div 2) A} else {PowLoop Y (I-1) Y*A} end end in {PowLoop X N 1.0} end

12/10/2004 P. Van Roy, InfoT4, S4 33 Introduction aux listes

12/10/2004P. Van Roy, InfoT4, S434 Introduction aux listes Une liste est une structure composée avec une définition récursive: Une liste est où une liste vide où un élément suivi par une autre liste Avec la notation EBNF: ::= nil | T | représente une liste déléments de type T et T représente un élément de type T Attention à la différence entre | et |

12/10/2004P. Van Roy, InfoT4, S435 Notation pour les types représente un entier; plus précisément lensemble de tous les entiers > représente lensemble de toutes les listes dentiers T représente lensemble de tous les éléments de type T; nous disons que T est une variable de type

12/10/2004P. Van Roy, InfoT4, S436 Syntaxe pour les listes (1) Syntaxe simple (lopérateur | au milieu) nil, 5|nil, 5|6|nil, 5|6|7|nil nil, 5|nil, 5|(6|nil), 5|(6|(7|nil)) Sucre syntaxique (la plus courte) nil, [5], [5 6], [5 6 7]

12/10/2004P. Van Roy, InfoT4, S437 Syntaxe pour les listes (2) Syntaxe préfixe (lopérateur | devant) nil |(5 nil) |(5 |(6 nil)) |(5 |(6 |(7 nil))) Syntaxe complète nil, |(1:5 2:nil) |(1:5 2:|(1:6 2:nil)) |(1:5 2:|(1:6 2:|(1:7 2:nil)))

12/10/2004P. Van Roy, InfoT4, S438 Opérations sur les listes Extraire le premier élément L.1 Extraire le reste de la liste L.2 Comparaison L==nil

12/10/2004P. Van Roy, InfoT4, S439 Longueur dune liste La longueur dune liste est le nombre déléments dans la liste On peut la calculer avec une fonction récursive: fun {Longueur L} if L==nil then 0 else 1+{Longueur L.2} end end

12/10/2004P. Van Roy, InfoT4, S440 Résumé Récursion sur les entiers Spécification Définition mathématique de la fonction; parfois inductive La réalisation dune spécification est sa définition en un langage de programmation Invariant Une formule logique qui est toujours vrai pour les arguments à chaque appel récursif Accumulateur Quand lappel récursif est le dernier appel, la mémoire utilisée est constante (à revoir avec la sémantique!) Un accumulateur est toujours lié à un invariant Liste et fonction récursive sur une liste