Initiation à la programmation impérative et algorithmique

Slides:



Advertisements
Présentations similaires
ALGORITHME DE TRI Le tri par insertion.
Advertisements

Les systèmes d’équationsLes systèmes d’équations Deux contraintes d’égalité qu’on impose simultanément à deux variables forment ce qu’on appelle « un.
I21 Algorithmique et programmation II David Gross-Amblard, Joël Savelli IEM-uB GFDL 1.2 CM 6/8 v1.1.
Enseigner l’arithmétique en série L Réflexions sur les contenus et les exigences.
Volée 1316 S3 Cours No 2_3 : Le nombre en 1-2H. Les fonctions du nombre  Dénombrer, énumérer, décrire une collection. Aspect cardinal  Dater, classer,
Complexité et Preuve des algorithmes
Ce videoclip produit par l’Ecole Polytechnique Fédérale de Lausanne
Utiliser le calcul littéral pour résoudre ou démontrer
Information, Communication, Calcul
Sylvain Hamel - Analyste
Coloration de graphe, backtracking, branch and bound
Un Algorithme , c'est Quoi ?
Session 1 6 mars 2017 Plateforme ICONICS Justine Guégan
ONEE-BE en partenariat avec le RACEE/ASAEE Formation de Formateurs
Algorithme et programmation
CCNP Routage Chapitre 4 - Questionnaire N°1
Techniques de décomposition
Algorithmique Avancée et Complexité Chap2:Complexité et Optimalité
Algorithmique demander jeu du pendu.
Algorithmique Avancée et Complexité Chap3:Diviser pour Régner
L’Instruction de Test Alternatif
Initiation à la programmation impérative et algorithmique
Javadoc et débogueur Semaine 03 Version A16.
Bddictionnairique Phase 1
Les Instructions – Organigramme
Principes de programmation (suite)
Activités algorithmiques
Master Réseaux et Systèmes Distribués (RSD) Algorithmique des systèmes
Master Réseaux et Systèmes Distribués (RSD) Algorithmique des systèmes
Plans d’expériences: Plans factoriels.
VI. Tri par tas (Heap sort)
Objectif de la séance Aujourd'hui nous allons travailler en opération.
Programmation Impérative II
Implantation d’un îlot ou d’une Chaîne de Production
Information, Communication, Calcul
Les tableaux.
1.2 dénombrement cours 2.
M1103 : Structures de données et algorithmes fondamentaux
Type Concret – Type Abstrait
Réseaux de neurones appliqués à la reconnaissance de caractères
Diviser un entier par un nombre à un chiffre
L1 Technique informatique
NUMERATION et REPRESENTATION DES NOMBRES
La projection orthogonale à vues multiples
Élections locales probabilistes
NOMBRES ENTIERS NÉGATIFS
Semaine #2 INF130 par Frédérick Henri.
Le code de Huffman: est une méthode de compression statistique de données qui permet de réduire la longueur du codage d'un alphabet. Le code de Huffman.
MATHÉMATIQUES FINANCIÈRES I
Algorithmique.
PRO1026 Programmation et enseignement
RABAH M ed Ali 2018/2019
Opérateurs et fonctions arithmétiques Opérateurs de relation Opérateurs logiques Cours 02.
Tris Simples/Rapides.
Exercices récapitulatifs
Arbre binaire.
Chapter 11: Récursivité Java Software Solutions Second Edition
Les différents types de calcul en lien avec les numérations orale et écrite Nathalie Pfaff Professeure agrégée de mathématiques à l’ESPE de l’académie.
Une autre façon de se former
CALCUL RAPIDE sur les nombres entiers
l’algorithme du simplexe
Elections locales probabilistes
Type Tableau Partie 1 : Vecteurs
Les données structurées et leur traitement
Problèmes multiplicatifs
Problèmes multiplicatifs
Problèmes multiplicatifs
PROJET R.A.N. LES FRACTIONS.
Séquence 1:Analyse du système d’information comptable
Transcription de la présentation:

Initiation à la programmation impérative et algorithmique Cours 7 – Récursivité Largement inspiré des cours : Vercouter, Del Mondo & Delestre, Hérault, Mainguenaud (INSA de Rouen) Elodie Laine – 06.10.2017

Définition et exemples Une entité est récursive lorsqu’on l’utilise pour la définir. Factorielle 0! = 1! = 1 n! = n(n - 1)! Suite de fibonacci F(0) = 0 F(1) = 1 F(n) = F(n – 1) + F(n – 2), n>1 Poupée russe Une poupée russe est : une poupée « pleine » une poupée vide contenant une poupée russe Elodie Laine – 06.10.2017

Exemple de pseudo-code Factorielle fonction fact (n : Naturel) : Naturel debut si (n=0) OU (n=1) alors retourner 1 sinon retourner n*fact(n-1) finsi fin Elodie Laine – 06.10.2017

Récursivité terminale On parle de récursivité terminale lorsque l’appel récursif est la dernière instruction de la fonction et qu’elle est isolée. fonction plus(a,b : Entier) : Entier debut si b=0 alors retourner a sinon retourner plus(a+1,b-1) finsi fin => plus(4,2)=plus(5,1)=plus(6,0)=6 Elodie Laine – 06.10.2017

Récursivité non terminale On parle de récursivité non terminale lorsque l’appel récursif n’est pas la dernière instruction de la fonction et/ou qu’elle n’est pas isolée (fait partie d’une expression). fonction plus(a,b : Entier) : Entier debut si b=0 alors retourner a sinon retourner 1+plus(a,b-1) finsi fin => plus(4,2)=1+plus(4,1)=1+1+plus(4,0)=6 Elodie Laine – 06.10.2017

Méthode Pour écrire un algorithme récursif, il faut analyser le problème et identifier : Le ou les cas particuliers, par ex. qui initient la récursion Le cas général qui effectue la récursion Lorsqu’on écrit un algorithme récursif, au moment de l’appel récursif, on se place en tant qu’utilisateur de l’algorithme : on considère donc que le problème est résolu Elodie Laine – 06.10.2017

Les tours de Hanoï Les tours de Hanoï est une jeu solitaire dont l’objectif est de déplacer les disques qui se trouvent sur une tour (par ex. ici la tour le plus à gauche) vers une autre tour (par ex. la tour le plus à droite). Certaines règles doivent être respectées : On ne peut déplacer que le disque se trouvant au sommet d’une tour On ne peut déplacer qu’un seul disque à la fois Un disque ne peut pas être posé sur un disque plus petit Elodie Laine – 06.10.2017

Les tours de Hanoï 2 1 3 Elodie Laine – 06.10.2017 Problème : on veut déplacer la tour N du plot 1 vers le plot 3 en utilisant le plot 2 comme intermédiaire. Le problème pour une tour N peut être résolu simplement si on sait le résoudre pour une tour N-1. En effet, une tour N est un disque unique surmonté d’une tour N-1. On transporte alors cette tour du plot 1 au plot 2 avec comme intermédiaire le plot 3 (opération 1). On déplace le disque restant du plot 1 au plot 3 (opération 2, permise par les règles du jeu). On transporte enfin la tour N-1 du plot 2 au plot 3 en prenant comme intermédiaire le plot 2 (opération 3). On a finalement bien transporter la tour N du plot 1 au plot 3 avec comme intermédiaire le plot 2. Elodie Laine – 06.10.2017

Les tours de Hanoï Opérations disponibles Objectif Type défini dans le programme Opérations disponibles Pour résoudre le problème des tours de Hanoï, on dispose des fonctions suivantes : fonction depilerTour (t : TourDeHanoi, d : Disque) Cette fonction permet d’extraire un disque d d’une tour de Hanoï t fonction empilerTour (t : TourDeHanoi, d : Disque) Cette fonction permet de poser un disque d sur une tour de Hanoï t Objectif L’objectif consiste à écrire une fonction récursive visant à résoudre le problème des tours de Hanoï : fonction resoudreToursDeHanoi (nbDisquesADeplacer : Entier, source, destination, intermediaire : TourDeHanoi) Elodie Laine – 06.10.2017

Les tours de Hanoï fonction resoudreToursDeHanoi (nbDisquesADeplacer : Entier, source, destination, intermediaire : TourDeHanoi) Declaration d : Disque debut si nbDisquesADeplacer > 0 alors resoudreTourDeHanoi(nbDisquesADeplacer-1, source, intermediaire, destination) depiler(source,d) empiler(destination,d) resoudreTourDeHanoi(nbDisquesADeplacer-1, intermediaire, destination, source) finsi fin Elodie Laine – 06.10.2017

Tris récursifs Objectif Tris non récursifs L’objectif consiste à écrire une fonction récursive visant à trier des valeurs dans un tableau : fonction trier(t : Tableau[1..MAX] d’Elements, nbElements : Entier) Tris non récursifs La compléxité des tris non récursifs vus jusqu’à présent est quadratique : Tri à bulles (O(n2)) Tri par sélection (O(n2)) Tri par insertion (O(n2)) Elodie Laine – 06.10.2017

Tris récursifs Principe L’algorithme des tris récursifs est basé sur le principe suivant : Diviser : Le tableau à trier est divisé en deux Régner : Les deux sous-tableaux sont triés indépendemment Combiner : Les deux tableaux sont combinés Plus particulièrement, le tri rapide (ou quick-sort) repose sur une stratégie efficace de division du tableau (partitionnement). Il se déroule comme suit : 1/ Partitionnement du tableau autour d’un élément pivot de sorte que tous les éléments du sous-tableau gauche sont plus petits que le pivot 2/ Tri des sous-tableaux gauche et droit de la même façon Elodie Laine – 06.10.2017

Le tri rapide (quick sort) fonction triRapide(t : Tableau[1..MAX] d’Entier, nb : Entier) debut triRapideRecursif(t, 1, nb) fin fonction triRapideRecursif (t : Tableau[1..MAX] d’Entier, d, f : Entier) Declaration indicePivot : Entier si d < f alors partitionner(t, d, f, indicePivot) triRapideRecursif(t, d, indicePivot – 1) triRapideRecursif(t, indicePivot + 1, f) finsi Elodie Laine – 06.10.2017

Le tri rapide (quick sort) Exemple de partitionnement d f 5 -3 4 8 -1 7 1 -6 9 d f -3 4 -6 -1 1 5 7 8 9 Ip Elodie Laine – 06.10.2017

Le tri rapide (quick sort) 5 -3 4 8 -1 7 1 -6 9 partitionner 1 -3 4 -6 -1 5 7 8 9 trier 1 -3 4 -6 -1 7 8 9 -3 -1 -6 1 4 7 9 8 -3 -1 -6 4 7 9 8 -6 -3 -1 8 9 -6 -1 Arbre des appels de procédures 8 Elodie Laine – 06.10.2017

Le tri rapide (quick sort) Fontionnement du partitionnement d f 5 -3 4 8 -1 7 1 -6 9 i j d f 5 -3 4 8 -1 7 1 -6 9 i j d f 5 -3 4 8 -1 7 1 -6 9 i j d f 5 -3 4 -6 -1 7 1 8 9 i j Elodie Laine – 06.10.2017

Le tri rapide (quick sort) Fontionnement du partitionnement d f 5 -3 4 -6 -1 7 1 8 9 i j d f 5 -3 4 -6 -1 7 1 8 9 i j d f 5 -3 4 -6 -1 1 7 8 9 i j d f 5 -3 4 -6 -1 1 7 8 9 i j Elodie Laine – 06.10.2017

Le tri rapide (quick sort) Fontionnement du partitionnement d f 5 -3 4 -6 -1 1 7 8 9 j i d f -3 4 -6 -1 1 5 7 8 9 Ip Elodie Laine – 06.10.2017

Le tri rapide (quick sort) fonction partitionner(t : Tableau[1..MAX] d’Entier, debut, fin : Entier) Declaration i, j, pivot, indicePivot : Entier debut pivot ← t[debut] i ← debut j ← fin tant que i ≤ j faire tant que t[i] ≤ pivot et i ≤ j faire i ← i + 1 fintantque tant que t[j] ≥ pivot et i ≤ j faire j ← j – 1 si i ≤ j alors echanger(t[i],t[j]) finsi indicePivot ← j echanger(t[debut],t[j]) fin Elodie Laine – 06.10.2017

Le tri rapide (quick sort) fonction partitionner(t : Tableau[1..MAX] d’Entier, debut, fin : Entier) Declaration i, j, pivot, indicePivot : Entier debut pivot ← t[debut] i ← debut j ← fin tant que i ≤ j faire si t[i] ≤ pivot alors i ← i + 1 sinon si t[j] ≥ pivot alors j ← j – 1 echanger(t[i],t[j]) finsi fintantque indicePivot ← j echanger(t[debut],t[j]) fin Elodie Laine – 06.10.2017

Le tri rapide (quick sort) Calcul de la complexité La fonction de partitionnement a une complexite en n. La complexité du tri rapide dépend dont du nombre d’appels récursifs (hauteur h de l’arbre de récursion) Dans le meilleur des cas, le partitionnement coupe le tableau en deux parties de même longueur (à plus ou moins 1 près) On a : n = 2h, donc h = log2 n Donc on a Ω(nlog2n) Dans le pire des cas, le partitionnement coupe le tableau en deux sous tableaux, l’un de longeur 1 et l’autre n – 1 Dans ce cas h = n Et donc on a O(n2) En moyenne on a θ(nlog2n) Elodie Laine – 06.10.2017

Conclusion Les algorithmes récursifs sont simples et permettent de résoudre des problèmes complexes. Il existe deux types de récursivité : terminale, qui algorithmiquement peut être transformée en non- récursivité non terminale Les algorithmes récursifs sont le plus souvent plus gourmands en ressource que leurs équivalents non récursifs. Il existe plusieurs algorithmes de tri que le peut classer selon la méthode utilisée (itératifs ou récursifs) et leur performance D’autres méthodes de tri existent, qui ne sont pas présentées dans ce cours : le tri par fusion, le shellsort, le tri par tas (ou heapsort), le radixsort..etc. Elodie Laine – 06.10.2017