Cours 2 : La récursivité. Principe Utilisation Exemples

Documents pareils
Complexité. Licence Informatique - Semestre 2 - Algorithmique et Programmation

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)

Algorithmes récursifs

Corrigé des TD 1 à 5

Initiation à l algorithmique

Programmation linéaire


INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Licence Sciences et Technologies Examen janvier 2010

Représentation d un entier en base b

Les structures de données. Rajae El Ouazzani

Cours d initiation à la programmation en C++ Johann Cuenin

1 Recherche en table par balayage

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

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

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

Les arbres binaires de recherche

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Algorithmique I. Algorithmique I p.1/??

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

Recherche dans un tableau

Rappels sur les suites - Algorithme

Cours d Algorithmique et de Langage C v 3.0

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

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Calculabilité Cours 3 : Problèmes non-calculables.

introduction Chapitre 5 Récursivité Exemples mathématiques Fonction factorielle ø est un arbre (vide) Images récursives

1 de 46. Algorithmique. Trouver et Trier. Florent Hivert. Mél : Florent.Hivert@lri.fr Page personnelle : hivert

Chapitre 5 : Flot maximal dans un graphe

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Exercices types Algorithmique et simulation numérique Oral Mathématiques et algorithmique Banque PT

Initiation. àl algorithmique et à la programmation. en C

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

La persistance des nombres

Représentation des Nombres

Algorithmique, Structures de données et langage C

Conventions d écriture et outils de mise au point

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

STAGE IREM 0- Premiers pas en Python

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

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

Glossaire des nombres

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Solutions du chapitre 4

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Algèbre binaire et Circuits logiques ( )

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

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

Continuité et dérivabilité d une fonction

Techniques de stockage. Techniques de stockage, P. Rigaux p.1/43

Cours de Systèmes d Exploitation

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

Informatique Générale

Cours 1 : La compilation

Résolution de systèmes linéaires par des méthodes directes

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

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

Cours Informatique Master STEP

Polynômes à plusieurs variables. Résultant

Quelques algorithmes simples dont l analyse n est pas si simple

Chapitre 7. Récurrences

Architecture des Systèmes d Information Architecture des Systèmes d Information

Objectifs du cours d aujourd hui. Informatique II : Cours d introduction à l informatique et à la programmation objet. Complexité d un problème (2)

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

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Chapitre 10. Les interfaces Comparable et Comparator 1

Cours d algorithmique pour la classe de 2nde

Initiation à la programmation en Python

ALGORITHMIQUE II NOTION DE COMPLEXITE. SMI AlgoII

Algorithme. Table des matières

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

Chapitre 2. Eléments pour comprendre un énoncé

Projet de programmation (IK3) : TP n 1 Correction

Chapitre 1 : Évolution COURS

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Algorithmique et Programmation Fonctionnelle

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

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

Université du Québec à Chicoutimi. Département d informatique et de mathématique. Plan de cours. Titre : Élément de programmation.

Cours 7 : Utilisation de modules sous python

Poker. A rendre pour le 25 avril

Seconde Généralités sur les fonctions Exercices. Notion de fonction.

Plan du cours. Historique du langage Nouveautés de Java 7

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Bases de données documentaires et distribuées Cours NFE04

Quelques tests de primalité

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

DOCM Solutions officielles = n 2 10.

Eteindre. les. lumières MATH EN JEAN Mme BACHOC. Elèves de seconde, première et terminale scientifiques :

Raisonnement par récurrence Suites numériques

PROJET 1 : BASE DE DONNÉES REPARTIES

Programmation Objet - Cours II

Leçon 01 Exercices d'entraînement

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

ALGORITHMIQUE ET PROGRAMMATION En C

Développement décimal d un réel

Comparaison de fonctions Développements limités. Chapitre 10

Transcription:

Cours 2 : La récursivité Principe Utilisation Exemples

Le principe de récursivité Tout objet est dit récursif s il se définit à partir de lui-même Ainsi, une fonction est dite récursive si elle comporte, dans son corps, au moins un appel à elle-même De même, une structure est récursive si un de ses attributs en est une autre instance 2013-2014 Algorithmique 2

Correspondance mathématique Principe de récurrence Exemple : définition des entiers (Peano) 0 est un entier Si n est un entier, alors n+1 est un entier 2013-2014 Algorithmique 3

Exemples de fonctions récursives Calcul de la somme des entiers de 1 à n On calcule la somme jusqu à n-1 Puis on ajoute n Idem avec le produit (fonction factorielle) 2013-2014 Algorithmique 4

Un peu de vocabulaire Pour une fonction récursive, on parlera : De récursivité terminale si aucune instruction n est exécutée après l appel de la fonction à elle-même De récursivité non terminale dans l autre cas 2013-2014 Algorithmique 5

void f(int n){ } Exemple Terminale if(n==0) System.out.println("Hello"); else f(n-1); Non terminale void f(int n) { } if(n>0) f(n-1); System.out.println("Hello");

Récursivité directe Lorsque f s appelle elle-même, on parle de récursivité directe Lorsque f appelle g qui appelle f, il s agit aussi de récursivité On l appelle alors indirecte 2013-2014 Algorithmique 7

Exemples de structures Liste récursive récursives Le premier élément Et le reste de la liste (qui est aussi une liste) Une expression arithmétique est : Soit une valeur Soit une expression, un opérateur et une autre expression 2013-2014 Algorithmique 8

Implémentation Comment programmer une fonction récursive? Quels sont les pièges à éviter? 2013-2014 Algorithmique 9

Programmer une fonction récursive Il suffit de la faire s appeler elle-même int f(int n){ return f(n-1); } La fonction f est récursive : elle s appelle elle-même Mais f n a-t-elle pas un problème? 2013-2014 Algorithmique 10

Une obbligation : s arrêter La fonction f telle qu elle est écrite ne s arrête pas : Appel : f(2) Appel : f(1) Appel : f(0) Appel : f(-1) Appel : f(-2) Etc... 2013-2014 Algorithmique 11

Comment y parvenir Première étape : la condition terminale Obligatoirement au début de toute fonction récursive Une condition : le cas particulier Pour ce cas, pas d autre appel à la fonction : la chaîne d appels s arrête 2013-2014 Algorithmique 12

void f(int n){ } Exemple if(n==0) System.out.println("Hello"); else f(n-1); Ici quand n vaut 0, on s arrête Problème : arrive-t-on à n = 0? 2013-2014 Algorithmique 13

Terminaison de la fonction Il faut que la fonction s arrête La condition terminale ne sert à rien si elle ne devient jamais vraie Exemple avec la fonction précédente : f(-2) provoque une pile d appels infinie Probablement d autres tests à faire (si n<0, envoyer une exception par exemple) 2013-2014 Algorithmique 14

Une bonne solution void f(int n) { if(n<0) System.exit(-1); if(n==0) System.out.println("Hello"); else f(n-1); } 2013-2014 Algorithmique 15

Pourquoi ça marche? Si n est négatif : on s arrête sur une exception Si n est nul : c est le cas d arrêt («Hello») Si n est positif : on appelle f avec la valeur n-1 Chaine d appels avec des valeurs entières strictement décroissantes de 1 en 1 On arrive forcément à 0 On affiche «Hello» On remonte la pile des appels (sans rien faire, ici la récursivité est terminale) 2013-2014 Algorithmique 16

Théorème de Gödel Il n existe pas de moyen automatique pour savoir si un programme termine ou pas 2013-2014 Algorithmique 17

Conclusion Il faut regarder cas par cas, et à la main Même si aucune méthode n est générale, le principe de récurrence aide souvent 2013-2014 Algorithmique 18

En résumé Une fonction récursive doit comporter : Un cas d arrêt dans lequel aucun autre appel n est effectué Un cas général dans lequel un ou plusieurs autres appels sont effectués La chaîne d appel doit conduire au critère d arrêt Optionnellement, des cas impossibles ou incorrects à traiter par des exceptions 2013-2014 Algorithmique 19

Quelques exemples Récursification facile ; récursivité obligatoire? 2013-2014 Algorithmique 20

Les boucles for Très bonne candidate Toute boucle for peut se transformer en une fonction récursive Principe : Pour faire des choses pour un indice allant de 1 à n On les fait de 1 à n-1 (même traitement avec une donnée différente) Puis on les fait pour l indice n (cas particulier) 2013-2014 Algorithmique 21

Traduction void f(int n) { } for (int i=0; i<=n; i++) traiter(i); void f(int n){ if(n==0) traiter(0); else { f(n-1); traiter(n); } }

Exemple : fonction factorielle int fact(int n) { } int res = 1; for (int i=1; i<=n; i++) res = res*i; return res; int fact(int n){ if(n==0) return 1; else return fact(n-1)*n; } 2013-2014 Algorithmique 23

Appel de fact(5) récursif Phase de descente récursive Appel à fact(5) Appel à fact(4) Condition terminale Appel à fact(3) Retour de la valeur 1 Appel à fact(2) Appel à fact(1) Appel à fact(0) 2013-2014 Algorithmique 24

Suite Phase de remontée (après l appel à fact(n-1) on multiplie par n : la récursivité n est pas terminale) Retour de la valeur 1 Retour de la valeur 2 Retour de la valeur 6 Retour de la valeur 24 Retour de la valeur 120 2013-2014 Algorithmique 25

Quelques conséquences La plupart des traitement sur les tableaux peuvent se mettre sous forme récursive : Tris (sélection, insertion) Recherche séquentielle (attention: pas dichotomique) Inversion Problème des huit reines Etc... 2013-2014 Algorithmique 26

Une constatation L écriture sous forme récursive est toujours plus simple que l écriture sous forme itérative 2013-2014 Algorithmique 27

Une question Une même fonction est-elle plus efficace sous forme récursive ou sous forme itérative? (Ou, sous une autre forme, y a-t-il un choix optimal généralisable?) La réponse est non. La réponse à la question inverse est non. Il n y a pas de généralité 2013-2014 Algorithmique 28

En revanche La plupart des traitements itératifs simples sont facilement traduisibles sous forme récursive (exemple du for) L inverse est faux Il arrive même qu un problème ait une solution récursive triviale alors qu il est très difficile d en trouver une solution itérative 2013-2014 Algorithmique 29

Les tours de Hanoï Problème : Transférer n disques de l axe A à l'axe C, en utilisant B, de sorte que jamais un disque ne repose sur un disque de plus petit diamètre Ici : n = 5 A B C 2013-2014 Algorithmique 30

Exemple pour n=3 A B C 2013-2014 Algorithmique 31

Solution récursive On veut déplacer n disques de A vers C Si n vaut 1, on déplace le disque Sinon On déplace d abord n-1 disques de A vers B On déplace le disque numéro n de A à C On déplace n-1 disques de B à C On a respecté la consigne : le disque n n est jamais au dessus d un disque plus petit

En résumé On a transformé un problème de taille n en deux problèmes de taille n-1 et un problème de taille 1 Tactique classique : «diviser pour régner» Essayez de trouver une solution itérative (bonne chance) 2013-2014 Algorithmique 33

La fonction d Ackermann Ack(m, n) vaut : n+1 si m=0 Ack(m-1,1) sinon et si n=0 Ack(m-1, Ack(m,n-1)) autrement Remarque : on finit bien car max(m,n) est strictement décroissant sur les appels (à l exception de Ack(1,0) qui finit trivialement) 2013-2014 Algorithmique 34