Étude expérimentale de la complexité de la fonction de Fibonacci (24 pt) Première partie du problème (8 pt)

Documents pareils
Correction Code nécessaire à la compilation : let bs ="\\" let nl = "\n" ;; let appliquer = List.map ;; (* affichage d'un noeud *)

Problème : Calcul d'échéanciers de prêt bancaire (15 pt)

chapitre 4 Nombres de Catalan

INF 232: Langages et Automates. Travaux Dirigés. Université Joseph Fourier, Université Grenoble 1 Licence Sciences et Technologies

Recherche dans un tableau

Vers l'ordinateur quantique

CH.6 Propriétés des langages non contextuels

Exo7. Calculs de déterminants. Fiche corrigée par Arnaud Bodin. Exercice 1 Calculer les déterminants des matrices suivantes : Exercice 2.

Cours Informatique Master STEP

RapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/ Présentation. 1.2 Ressources

Algorithmes d'apprentissage

Exercice 6 Associer chaque expression de gauche à sa forme réduite (à droite) :

Représentation d un entier en base b

OLYMPIADES ACADEMIQUES DE MATHEMATIQUES. 15 mars 2006 CLASSE DE PREMIERE ES, GMF

Jeux de caracte res et encodage (par Michel Michaud 2014)

Raisonnement par récurrence Suites numériques

Deux disques dans un carré

Feuille TD n 1 Exercices d algorithmique éléments de correction

Système binaire. Algèbre booléenne

Les droites (d 1 ) et (d 2 ) sont sécantes en A Le point A est le point d intersection des 2 droites

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

GOL-502 Industrie de services. Travaux Pratique / Devoir #7

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

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

2. RAPPEL DES TECHNIQUES DE CALCUL DANS R

Date : Tangram en carré page

Calcul matriciel. Définition 1 Une matrice de format (m,n) est un tableau rectangulaire de mn éléments, rangés en m lignes et n colonnes.

Cours 1 : La compilation

Projet d informatique M1BI : Compression et décompression de texte. 1 Généralités sur la compression/décompression de texte

DEVOIR MAISON : THEME : LES CLES DE CONTROLE. I. La clé des codes barres

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Géométrie dans l espace Produit scalaire et équations

Chap 4: Analyse syntaxique. Prof. M.D. RAHMANI Compilation SMI- S5 2013/14 1

Introduction a l'algorithmique des objets partages. Robert Cori. Antoine Petit. Lifac, ENS Cachan, Cachan Cedex. Resume

«Aucune investigation humaine ne peut être qualifiée de science véritable si elle ne peut être démontrée mathématiquement.

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

Introduction : Cadkey

MIS 102 Initiation à l Informatique

Arbres binaires de recherche

Conception de circuits numériques et architecture des ordinateurs

Cours d Informatique

Algorithmes de recherche

"! "#$ $ $ ""! %#& """! '& ( ")! )*+

BANQUES DE DONNÉES PÉDAGOGIQUES

Construction de l'intégrale de Lebesgue

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Importation des données dans Open Office Base

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

MODE D'EMPLOI DE LA CALCULATRICE POUR LES COURTS SÉJOURS DANS L'ESPACE SCHENGEN

TD : Codage des images

Initiation à la programmation en Python

Durée de L épreuve : 2 heures. Barème : Exercice n 4 : 1 ) 1 point 2 ) 2 points 3 ) 1 point

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

Master IMA - UMPC Paris 6 RDMM - Année Fiche de TP

LibreOffice Calc : introduction aux tableaux croisés dynamiques

Logiciel SCRATCH FICHE 02

Compte-rendu de projet de Système de gestion de base de données

Manuel Utilisateur. Module CAISSE

Chapitre 3. Mesures stationnaires. et théorèmes de convergence

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Université Ibn Zohr Excel Résume de cours

Découverte du tableur CellSheet

Programmation par contraintes. Laurent Beaudou

AC AB. A B C x 1. x + 1. d où. Avec un calcul vu au lycée, on démontre que cette solution admet deux solutions dont une seule nous intéresse : x =

Planche n o 22. Fonctions de plusieurs variables. Corrigé

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

SOCLE COMMUN - La Compétence 3 Les principaux éléments de mathématiques et la culture scientifique et technologique

2.4 Représentation graphique, tableau de Karnaugh

Formats d images. 1 Introduction

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

Université Paris-Dauphine DUMI2E 1ère année, Applications

Développements limités. Notion de développement limité

STAGE IREM 0- Premiers pas en Python

Sécurité de l'information

LE PROCESSUS ( la machine) la fonction f. ( On lit : «fonction f qui à x associe f (x)» )

Axiomatique de N, construction de Z

Probabilités sur un univers fini

Plus courts chemins, programmation dynamique

Exercices du Cours de la programmation linéaire donné par le Dr. Ali DERBALA

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Introduction à MATLAB R

GUIDE de prise en main. let s play

SPECIFICATION DES ECHANGES DE DONNEES INFORMATISES (E.D.I.)

Simulation de variables aléatoires

TP3 : Creation de tables 1 seance

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

SAGE: Introduction. 1 Connections WEB. 2 Généralités. 1.1 Sur le web insset. 2.1 Conception modulaire. Sage. 100-Introduction

Cours d introduction à l informatique. Partie 2 : Comment écrire un algorithme? Qu est-ce qu une variable? Expressions et instructions

Définition : On obtient les nombres entiers en ajoutant ou retranchant des unités à zéro.

Les chaînes de caractères

Les ateliers du Resclin. Préparation des données issues d Epi-Info en utilisant le tableur Excel

Structures algébriques

Nuxeo Enterprise Platform: Guide utilisateur

Application 1- VBA : Test de comportements d'investissements

Guide d utilisation. Table des matières. Mutualisé : guide utilisation FileZilla

Chapitre 1 Qu est-ce qu une expression régulière?

1 Introduction au codage

Introduction à la théorie des graphes. Solutions des exercices

La Clé informatique. Formation Internet Explorer Aide-mémoire

Emporter Windows XP sur une clé USB

Transcription:

Étude expérimentale de la complexité de la fonction de Fibonacci (24 pt) L'objectif de ce problème est d'étudier le nombre d'appels récursifs eectués lors du calcul des nombres de Fibonacci. C'est un exemple classique qui montre qu'une fonction mal écrite peu engendrer un nombre gigantesque d'appels récursifs inutiles. Pour le voir, nous allons demander à la fonction de Fibonacci de construire l'arbre de ses appels récursifs. Dans la seconde partie du problème nous acherons cet arbre et dans la troisième partie nous écrirons une version plus ecace de la fonction de Fibonacci. Première partie du problème (8 pt) 1 Commençons par dénir la fonction de Fibonacci Q1. (1 pt) Donnez la réalisation de la fonction b qui prend en paramètre un entier n et retourne le n ieme nombre de Fibonacci. Prol b :................ Sémantique : b(n) est le n ieme terme de la suite de Fibonacci (u n ) n N dénie par u 0 = 1 u 1 = 1 u n = u n 1 + u n 2 Dénition récursive de la fonction par des équations (1) b(.. ) =.. (2) b(.. ) =.. (3) b(.. ) =............................................... pour n....... Q2. (1 pt) Rédigez la preuve de terminaison de la fonction b. TERMINAISON preuve : On dénit la fonction Mesure (.. ) def =.. (i) Justions que la mesure choisie retourne des valeurs dans N:............. (ii) Montrons que la mesure....................................... à chaque appel récursif. Pour (ii), on repère les équations qui comportent des............................... et on prouve la décroissance de la mesure pour.............. appel................

Rédigez la preuve de terminaison ici Q3. (.75 pt) Indiquez les appels récursifs engendrés par b(4) sous la forme d'un arbre. Utilisez l'espace libre pour prolonger les branches de l'arbre si nécessaire. appelle.......... appelle appelle.......... appelle appelle.......... appelle........................................ 2 Dénition de l'arbre des appels récursifs Les appels récursifs engendrés par b(x) pour x....... ar(ag, x, ad) où ar signigie Appel Récursif seront représentés sous la forme d'un arbre le n ud x indique qu'il s'agit du calcul de b(x) et qu'il a nécessité les appels récursifs rangés dans les arbres ag et ad ag est l'arbre des appels récursifs engendrés par b(........... )

ad est l'arbre des appels récursifs engendrés par b(........... ) Q4. (0.5 pt) Complétez les remarques précédentes et suivantes, ainsi que la dénition du type Abar (Arbre Binaire d'appels Récursifs). L'arbre des appels récursifs de la fonction de Fibonacci est un arbre.............. puisque la fonction fait.......... appels récursifs. Lorsque le calcul de b(x) n'engendre pas d'appel récursif son arbre d'appel est représenté par rd(x) où rd signie Résultat Direct et x indique qu'il s'agit du calcul de b(x). Q5. (1 pt) Donnez la représentation à l'aide des constructeurs rd et ar de l'arbre d'appels de b(0) :............ l'arbre d'appels de b(2) : ar(............,..,............ ) puis complétez la dénition de Abar. DÉFINITION MATHÉMATIQUE D'UN ENSEMBLE déf Abar = {............ x............} {........................... x...., ag, ad..........} DÉFINITION INFORMATIQUE D'UN TYPE type nat =... type abar =...... Q6. (1.5 pt) Complétez la dénition de la fonction calcul-de-b qui calcule le terme de la suite de Fibonacci et construit simultanément l'arbre des appels récursifs de la fonction b. Prol calcul-de-b : N N Abar Sémantique : calcul-de-b(n) est un couple constitué du n ieme nombre de Fibonacci et de l'arbre des appels récursifs engendrés par le calcul de u n. Exemples 1. calcul-de-b(0) = (...................... ) 2. calcul-de-b(1) = (...................... ) 3. calcul-de-b(2) = (................................................. )

let rec (calcul_de_fib :...) = function.. -> (..,... ).. -> (...).. -> let............ ;; 3 Étude de l'arbre des appels récursifs On dispose maintenant d'une fonction calcul-de-b qui construit l'arbre d'appels récursifs de b. On aimerait par exemple compter le nombre de fois où le calcul de b(x) a demandé de calculer b(k). Pour cela on a besoin de compter le nombre d'apparitions d'un n ud dans un Abar. Q7. (1.5 pt) Complétez la fonction nb-occ qui compte le nombre d'apparitions du n ud k dans un Abar. Prol nb-occ :............................... Sémantique : nb-occ(k, a) est le nombre d'occurences du n ud k dans l'arbre d'appel a Dénition récursive de la fonction par des équations (1) nb-occ(................. ) =.. si............ (1 ) nb-occ(................. ) =......................... (2) nb-occ(................................ ) =............................................................ si............ (2 ) nb-occ(................................ ) =............................................................................................ let rec (nb_occ :...) = function (k,a) ->..................

Q8. (0.75 pt) a) À l'aide des fonctions calcul-de-b et nb-occ, donnez l'expression Ocaml qui permet de connaître le nombre de fois qu'est demandé le calcul de b(1) dans le calcul de b(121)....... Le tableau suivant donne en fonction de n le nombre d'appels à b(1) dans le calcul de b(n). b) Complétez les premières cases du tableau n 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 nombre d'appels à b(1) dans le calcul de b(n).......... 5 8 13 21 34 55 89 144 233 377 n 15 20 21 22 23 24 25 26 27 nombre d'appels à b(1) dans le calcul de b(n) 610 6765 10946 17711 28657 46368 75025 121393 196418

Seconde partie du problème (12 pt) 4 Achage de l'arbre des appels récursifs L'objectif de cette partie est de réaliser une fonction d'achage d'un arbre d'appel sous la forme suivante, avec les valeurs des appels à la place des ( - ). Notre objectif est d'acher un arbre fib(_) / \ fib(_) fib(_) / \ / \ fib(_) fib(_) fib(_) fib(_) / \ / \ / \ fib(_) fib(_) fib(_) fib(_) fib(_) fib(_) / \ fib(_) fib(_) ar(ag, n, ad) sous la forme fib(n) / \ ag ad et d'appliquer le même principe au sous-arbre gauche ag et au sous-arbre droit ad. Pour obtenir ce résultat nous devrons 1. transformer le sous-arbre ag en colonne de ligne colg 2. placer le symbole / centré au dessus de cette colonne colg 3. transformer le sous-arbre ad en colonne de ligne cold 4. placer le symbole \ centré au dessus de cette colonne cold 5. coller les colonnes obtenues aux étapes 2 et 4 (opération notée sur le schéma) 6. placer le titre fib(n) centré au dessous des deux colonnes collées an d'obtenir la colonne correspondant à l'arbre ar(ag, n, ad). Le principe de transformation d'un arbre en colonne est résumé par le schéma ci-après : (les êches indiquent que le titre doit être centré). "fib(n)" "/" sous arbre gauche }{{} colg "\" sous arbre droit }{{} cold Pour mettre en uvre ce principe nous allons dénir un type Colonne et des opérations de manipulations des colonnes. On décide représenter une colonne de ligne

"abcdefgh" "ijklmnop" "qrstuvwx" par une séquence de chaîne de caractère [ "abcdefgh" ; "ijklmnop" ; "qrstuvwx" ; "yz" ] "yz" Q9. (0.5 pt) Complétez la dénition du type Colonne. DÉFINITION MATHÉMATIQUE D'UN ENSEMBLE déf Colonne =.......................... DÉFINITION INFORMATIQUE D'UN TYPE type colonne =... et indiquez l'opérateur qui permet d'ajouter une ligne au dessus d'une colonne..... Justiez votre réponse :................................................................................................................................................................................ Q10. (1 pt) Utilisez l'opérateur Ocaml ( ˆ ) : Chaîne Chaîne Chaîne pour réaliser la fonction espace spéciée ainsi : Prol espace : Z Chaîne Sémantique : espace(n) est la chaînes de caractère consitutée de n espaces. Propriété n 0, espace(n) = ""............... Q11. (1 pt) Utilisez la fonction length prédénie en Ocaml pour réaliser la fonction largeur. Prol length : Chaîne Séq (Élt) N Sémantique : length(ch) est la longueur de la chaîne ch, c'est-à-dire le nombre de caractères qu'elle contient. Notez que la fonction length s'applique aussi bien aux chaînes de caractère qu'aux séquences.

Prol largeur : Colonne N Sémantique : largeur(col) est la largeur de la colonne. Précisons que les lignes de la colonne n'ont pas nécessairement la même longueur. Algorithme : La largeur d'une colonne est la longueur de sa ligne la plus longue. Dénition récursive de la fonction par des équations (1) largeur(... ) =..... (2) largeur(............ ) =................................................................................................................................................................................................................................................................... Q12. (1 pt) Complétez la réalisation de la fonction titrer qui permet de placer un titre centré au sommet d'une colonne. Prol titrer : Chaîne Colonne Colonne Sémantique : titrer(titre, col) place le titre centré au haut de la colonne. Exemple titrer "titre", "abcdefghijklmnopqrs" "abcdefghijklmnopqrs" "abcdefghijklmnopqrs" "abcdef" = " titre" "abcdefghijklmnopqrs" "abcdefghijklmnopqrs" "abcdefghijklmnopqrs" "abcdef" Algorithme : Notons lc la largeur de la colonne et lt la taille du titre alors le nombre ne d'espaces qu'on doit ajouter à gauche du titre est : ne =........................ let (titrer :...) = function (titre,col) ->............ Q13. (0.5 pt) Donnez la réalisation en Ocaml de la fonction compléter-chaine.

Prol compléter-chaine : N Chaîne Chaîne Sémantique : compléter-chaine(l, ch) est une chaîne de caractère de taille l constituée de ch suivie d'espaces Exemples 1. compléter-chaine(5, "ab") = "ab " 2. compléter-chaine(5, "abcde") = "abcde" 3. compléter-chaine(5, "") = " "............ ;; Q14. (1 pt) Complétez la spécication de la fonction appliquer. Prol appliquer : (T 1 T 2 ) Séq (T 1 ) Séq (.....) Sémantique : appliquer f [e 1 ; e 2 ;... ; e n ] = [f(e 1 ) ; f(e 2 ) ;... ; f(e n )] Exemples On rappelle que (f unction x e) est une fonction qui à x associe la valeur de l'expression e. 1. appliquer (function x 2 x + 1) [0; 1; 2; 3] =............................. 2. appliquer (function x.................... ) [0; 3; 2; 5; 1] = [ (0, 0) ; (3, 9) ; (2, 4) ; (5, 25) ; (1, 1) ] 3. appliquer (function........... y) [ (0, 0); (3, 9), (2, 4); (5, 25); (1, 1) ] =.......................... Ajuster une colonne en ajoutant des espaces en n de lignes On appelle colonne ajustée une colonne dont toutes les lignes ont la même taille. On dénit ColonneAjustée comme l'ensemble des couples constitués d'une colonne et de sa largeur.

Q15. (0.25 pt) Complétez la déntion de type. DÉFINITION MATHÉMATIQUE D'UN ENSEMBLE déf ColonneAjustée =............................ DÉFINITION INFORMATIQUE D'UN TYPE type colonne_ajustée =... Q16. (1.25 pt) Utilisez les fonctions appliquer et compléter-chaine pour réaliser en Ocaml la fonction ajuster-colonne qui complète les lignes d'une colonne par des espaces en n de ligne an que toutes les lignes aient la même taille. Prol ajuster-colonne : Colonne ColonneAjustée Sémantique : ajuster-colonne(col) est la colonne ajustée correspondant à col Exemple ajuster-colonne "abcdef" "abc" "abcdefgh" = "abcdef " "abc " "abcdefgh",.. "a" "a " Algorithme : On rappelle qu'une colonne est une séquence de chaîne de caractère et qu'on peut donc utiliser la fonction appliquer avec les colonnes. let (ajuster_colonne : colonne -> colonne_ajustée) =........... ;; Q17. (1.5 pt) Complétez la réalisation de la fonction coller qui prend en paramètre deux colonnes déjà ajustées et qui les colle ligne à ligne. Vous pouvez évidemment utiliser des fonctions écrites précédemment. Prol coller :......................................................................... Colonne Sémantique : coller(caj 1, caj 2 ) est la colonne ajustée obtenue en collant ligne par ligne la colonne ajustée caj 1 à la colonne ajustée caj 2. Précisons que les colonnes sont ajustées, par contre elles n'ont pas nécessairement le même nombre de ligne.

Exemples Vous remarquerez dans les exemples que les deux colonnes doivent être séparées par un espace. 1. coller 2. coller (( "abcdef" "abcdef" "ab " ( ( "abcdef" "ab ", 6 ), ( ) (, 6, "gh " "ghij" "ghi " "ligne 1" "ligne 2" "ligne 3", 4 )), 7 )) = "abcdef gh " "abcdef ghij" "ab ghi " = "abcdef ligne 1" "ab ligne 2" " ligne 3" Dénition récursive de la fonction par des équations (1) coller( (..., l 1 ), (..., l 2 ) ) =... (2) coller(..........................,.......................... ) =........................................................................................ (3) coller(.............,.......................... ) =..................................................................................................... (4) coller(..........................,.......................... ) =..................................................................................................... Q18. (0.5 pt) Complétez la réalisation Ocaml de la fonction coller-colonne. Prol coller-colonne : Colonne Colonne Colonne Sémantique : coller-colonne(col 1, col 2 ) est la colonne obtenue en collant les colonnes col 1 et col 2 après ajustement. Exemple coller-colonne ( "abcdef" "ab ", "ligne 1" "ligne 2" "ligne 3" ) = "abcdef ligne 1" "ab ligne 2" " ligne 3" let (coller_colonne : colonne * colonne -> colonne) =........ On dispose maintenant de toutes les fonctions nécessaires pour réaliser la fonction arbre-vers-colonne qui applique le principe présenté en Section 4 pour transformer un arbre d'appel en colonne.

Q19. (1.5 pt) Utilisez les fonctions des questions précédentes pour réaliser la fonction arbre-vers-colonne. Prol arbre-vers-colonne : Abar Colonne Sémantique : arbre-vers-colonne(a) est la colonne correspondant à l'arbre a construite selon le principe de la Section 4. Dénition récursive de la fonction par des équations (1) arbre-vers-colonne(.............) =............ où titre =.......................................................................... (2) arbre-vers-colonne(........................... ) =........................................................................................... où colg =................................................................................. où cold =................................................................................... où titre =.......................................................................... Q20. (0.75 pt) Complétez la réalisation Ocaml de la fonction colonne-vers-chaîne. Prol colonne-vers-chaîne : Colonne Chaîne Sémantique : colonne-vers-chaîne(col) est la chaîne de caractère construite par concaténation des lignes de la colonne en introduisant un saut de ligne entre les lignes. Algorithme : On obtient un saut de lignes en ajoutant le caractère \n en n de ligne. let rec (colonne_vers_chaine :...) = function......... ;; Q21. (1 pt) Dénissez une fonction qui transforme un arbre en chaîne de caractère et donnez ensuite l'expression Ocaml qui permet d'acher à l'écran la chaîne de caractère qui correspond à l'arbre des appels de b(121). Prol.................................... :................................. Sémantique :................................................................................................................................................................

......... ;;......

Troisième partie du problème (4 pt) 5 Compter les appels engendrés par b(n) sans construire l'arbre d'appels L'arbre des appels est très utile pour comprendre comment se déroule l'évaluation de la fonction b ; en revanche il n'est pas nécessaire si on souhaite juste compter le nombre total d'appels récursifs engendrés par b(n). Pour eectuer ce décompte nous allons dénir la fonction nb-total-appel-de-b. Q22. (1.5 pt) Complétez la dénition de la fonction nb-total-appel-de-b. Prol nb-total-appel-de-b : N N N Sémantique : nb-total-appel-de-b(n) = (u n, nb) où u n est le n ieme terme de la suite de Fibonacci et nb le nombre total d'appels engendrés par l'appel à b(n) Dénition récursive de la fonction par des équations (1) nb-total-appel-de-b(.. ) =........... (2) nb-total-appel-de-b(.. ) =........... (3) nb-total-appel-de-b(.. ) =..................................................... si............ où....................... =......................................................... où....................... =......................................................... Coïncidence : D'après les équations récursives que pouvez-vous dire du nombre d'appels qu'engendre l'appel b(n)? Justiez votre réponse :.......................................................................................................................................................... 6 Une version plus ecace de Fibonacci Q23. (2.5 pt) Complétez la dénition de la fonction b2 qui calcule les termes de la suite de Fibonacci sans faire de double appel récursif et montrez la terminaison de la fonction b2. Prol b2 : N N N Sémantique : b2(n) = (u n, u n+1 ) où u n et u n+1 sont les n ieme et n + 1 ieme termes de la suite de Fibonacci.

Dénition récursive de la fonction par des équations (1)............. =........... (2).............. =................................. où................................................... ;; TERMINAISON