Chapitre 1. Programmation en Python 2ème année. 23 septembre 2014. E-mail mlahby@gmail.com



Documents pareils
STAGE IREM 0- Premiers pas en Python

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

Représentation d un entier en base b

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

Licence Sciences et Technologies Examen janvier 2010

Initiation à l algorithmique

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

Initiation à la programmation en Python

MIS 102 Initiation à l Informatique

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

Chapitre 7. Récurrences

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

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

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

Corrigé des TD 1 à 5

V- Manipulations de nombres en binaire

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

Algorithmique et Programmation, IMA

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

1 Recherche en table par balayage

I. Cas de l équiprobabilité

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


4. Les structures de données statiques

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

I. Introduction aux fonctions : les fonctions standards

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

Recherche dans un tableau

TP 1. Prise en main du langage Python

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Introduction à MATLAB R

1 Définition et Appel d une fonction. V. Phan Luong. Cours 4 : Fonctions

La fonction exponentielle

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Déroulement. Evaluation. Préambule. Définition. Définition. Algorithmes et structures de données 28/09/2009

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Génie Logiciel avec Ada. 4 février 2013

Rappels sur les suites - Algorithme

Algorithmique I. Algorithmique I p.1/??

Algorithmique, Structures de données et langage C

Arbres binaires de recherche

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

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

Java Licence Professionnelle CISII,

Quelques algorithmes simples dont l analyse n est pas si simple

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

Algorithmes et mathématiques. 1. Premiers pas avec Python. Exo Hello world!

1 Lecture de fichiers

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

Programmation Web. Madalina Croitoru IUT Montpellier

Cours d Algorithmique et de Langage C v 3.0

Conventions d écriture et outils de mise au point

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

III- Raisonnement par récurrence

TP3 : Manipulation et implantation de systèmes de fichiers 1

Programmes des classes préparatoires aux Grandes Ecoles

Cours 1 : La compilation

La boucle for La boucle while L utilisation du if else. while (condition) { instruction(s) }

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

Définitions. Numéro à préciser. (Durée : )

Présentation du langage et premières fonctions

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

Architecture des ordinateurs

Par combien de zéros se termine N!?

Introduction au langage C

Algorithmique et structures de données I

Factorisation Factoriser en utilisant un facteur commun Fiche méthode

Introduction à l informatique en BCPST

Programmation avec Xcas ou Python

Les algorithmes de base du graphisme

Module 16 : Les fonctions de recherche et de référence

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

Algorithmes et Programmes. Introduction à l informatiquel. Cycle de vie d'un programme (d'un logiciel) Cycle de vie d'un programme (d'un logiciel)

Les structures de données. Rajae El Ouazzani

Claude Delannoy. 3 e édition C++

Algorithme. Table des matières

Image d un intervalle par une fonction continue

Présentation du PL/SQL

Calcul Formel et Numérique, Partie I

Premiers Pas en Programmation Objet : les Classes et les Objets

Solutions du chapitre 4

Probabilités. Rappel : trois exemples. Exemple 2 : On dispose d un dé truqué. On sait que : p(1) = p(2) =1/6 ; p(3) = 1/3 p(4) = p(5) =1/12

Module BDWEB. Maîtrise d informatique Cours 9 - Xquery. Anne Doucet. anne.doucet@lip6.fr

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

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

Architecture des ordinateurs

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

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

Organigramme / Algorigramme Dossier élève 1 SI

Utilisation d objets : String et ArrayList

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

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

Gestion mémoire et Représentation intermédiaire

Les arbres binaires de recherche

Un ordonnanceur stupide

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Cours de Probabilités et de Statistique

Transcription:

Chapitre 1 La récursivité Programmation en Python 2ème année E-mail mlahby@gmailcom 23 septembre 2014 Programmation en Python 2ème année CPGE GSR 2014-2015 1/ 24

Plan 1 Rappel 2 Récurrence en mathématique Définition d algorithme récursif Comment écrire une fonction récursive? 3 La récursivité simple La récursivité multiple La récursivité imbriquée La récursivité mutuelle 4 5 Complexité d une fonction récursive Limitation de la récursivité en Python Programmation en Python 2ème année CPGE GSR 2014-2015 2/ 24

Rappel L approche efficace pour résoudre un problème complexe consiste souvent à le décomposer en plusieurs sous-problèmes plus simples qui seront étudiés séparément D autre part, il arrive souvent qu une même séquence d instructions sera utilisée à plusieurs reprises dans un programme, et on souhaite évidemment ne pas avoir à la reproduire systématiquement Le concept de la programmation modulaire permet de résoudre les difficultés évoquées ci-dessus en utilisant la notion de fonction (sous programme) Toutes les fonctions qu on a définit jusqu au maintenant représentent des algorithmes itératifs Une fonction peut appeler une autre fonction Un cas particulier elle peut appeler elle même, c est l objectif de ce cours Programmation en Python 2ème année CPGE GSR 2014-2015 3/ 24

Rappel Syntaxe La syntaxe Python pour la définition d une fonction est la suivante : def nomdelafonction (paramètres eventuels) : bloc d instructions Exemples 1 Exemple 1 : Une fonction qui nécessite un paramètre def cube(x) : y=x**3 return(y) En entrant print(cube(2)), on obtiendrait l affichage du nombre 8 2 Exemple 2 : Une fonction ne nécessite pas forcément de paramètre def table8() : n=1 while n =10 : print(n, x,8, =,n*8) n=n+1 L appel de la fonction lancerait l affichage de la table de 8 Programmation en Python 2ème année CPGE GSR 2014-2015 4/ 24

Récurrence en mathématique Récurrence en mathématique Définition d algorithme récursif Comment écrire une fonction récursive? Nous allons commencer par l exemple de la suite numérique, (U n) définie pour n IN par ( U 0 = 1 U n = 2 U n 1 + 3 U n est appelé une suite récurrente U n = 2 (2 ((2 U 0 + 3)) + 3) + 3 La conception d une fonction récursive n est pas éloignée du principe de démonstration par récurrence Le principe de démontration par récurrence est le suivant : 1 On démontre d une part que la suite U n satisfait une telle propriété (croissante, décroissante,) pour le cas de base U 0 2 D autre part, on suppose que cette propriété est valide pour U n 1 et on démontre que cela implique que la suite U n satisfait aussi cette propriété pour tout n > 0 Programmation en Python 2ème année CPGE GSR 2014-2015 5/ 24

Définition d algorithme récursif Récurrence en mathématique Définition d algorithme récursif Comment écrire une fonction récursive? Fonction récursive Une fonction est dite récursive si elle s appelle elle-même au cours de son exécution Avantages de la récursivité La récursivité permet d exprimer d une manière élégante la solution de plusieurs problèmes : - Récurrences mathématiques classiques - Tour d Hanoï - Tri rapide, tri fusion, - Recherche dichotomique, La récursivité est particulièrement adapté lorsqu elle est appliquée à une structure récursive Les listes et les arbres peuvent être vu comme des structure récursives Programmation en Python 2ème année CPGE GSR 2014-2015 6/ 24

Récurrence en mathématique Définition d algorithme récursif Comment écrire une fonction récursive? Comment écrire une fonction récursive? Principe Exemple L idée de base pour l écrire d une fonction récursive consiste à définir tout d abord le modèle mathématique de la fonction de récurrence Dans ce modèle de mathémtique il faut determiner condition d arrêt pour assurer la terminaison de l algorithme Nous pouvons donc définir la fonction factorielle de la manière suivante : ( 1 si n = 0 n! = n n! sinon n!=n*(n-1)! représente la relation de récurrence 0!=1 représente la valeur de la terminaison de l algorithme Programmation en Python 2ème année CPGE GSR 2014-2015 7/ 24

Le code en Python Récurrence en mathématique Définition d algorithme récursif Comment écrire une fonction récursive? Méthode itérative def fact Iter(n) : F=1 for i in range (1,n+1) : F=F*i return F Méthode récursive def fact Rec(n) : if n==0 : return 1 else : return n*fact Rec(n-1) Programmation en Python 2ème année CPGE GSR 2014-2015 8/ 24

La récursivité simple La récursivité simple La récursivité multiple La récursivité imbriquée La récursivité mutuelle Définition :pour ce type de récursivité on fait un seul appel récursif pour la fonction P dans le corps d une fonction récursive P Exemple 1 : calcul de puissance x n = ( 1 si n = 0 n n! sinon Questions : 1 Ecrire le code de la fonction récursive Puissance qui retourne la valeur de x n 2 Donner la trace d exécution pour calculer 2 3 Exemple 2 : calcul de puissance (version rapide) 8 >< 1 si n = 0 x n = a a si n est pair, avec a = x n 2 >: x a a si n est impair, avec a = x n 2 Questions : 1 Ecrire le code de cette fonction récursive nommée Puiss rapide 2 Donner la trace d exécution pour calculer Puiss rapide(3, 5) Programmation en Python 2ème année CPGE GSR 2014-2015 9/ 24

La récursivité multiple La récursivité simple La récursivité multiple La récursivité imbriquée La récursivité mutuelle Définition : Une récursivité est multiple si il y a plusieurs appels résursifs a une fonction P dans le corps d une fonction récursive P Exemple 3 : suite de Fibonacci 8 >< 1 si n = 0 F n = 1 si n = 1 >: F n 1 + F n 1 si n >= 2 Questions : 1 Ecrire le code de la fonction récursive Fibo Re qui retourne la valeur de F n 2 Donner la trace d exécution pour calculer F 4 Exemple 4 : Calcul de combinaison 8 >< 1 si p = 0 Cn p = 1 si n = 0 >: C p n 1 + C p 1 n 1 sinon Questions : 1 Ecrire le code de cette fonction récursive 2 Donner la trace d exécution pour calculer C 2 6 Programmation en Python 2ème année CPGE GSR 2014-2015 10/ 24

La récursivité imbriquée La récursivité simple La récursivité multiple La récursivité imbriquée La récursivité mutuelle Définition : Une récursivité est dite imbriquée si une fonction récursive P contient un appel imbriqué Exemple 2 : La fonction d ACKERMANN 8 >< p + 1 si n = 0 Ack(n, p) = Ack(n 1, 1) si n > 0 et p = 0 >: Ack(n 1, Ack(n, p 1)) sinon Questions : 1 Calculer a la main Ack(1,0) ; Ack(2,0) et Ack(3,0) : 2 Ecrire le code de cette fonction récursive 3 Donner la trace d exécution pour calculer Ack(3, 2) Programmation en Python 2ème année CPGE GSR 2014-2015 11/ 24

La récursivité mutuelle La récursivité simple La récursivité multiple La récursivité imbriquée La récursivité mutuelle Définition : Une récursivité est mutuelle ou croisée quand une fonction P appelle une autre fonction Q qui déclenche un appel récursif à P Remarque : La situation est obligatoirement symétrique, puisque Q déclenchera un appel de P, qui délenchera à son tour un appel de Q Exemple 1 : La parité d un entier naturel n ( vrai si n = 0 pair(n) = impair(n 1) sinon impair(n) = ( faux si n = 0 pair(n 1) sinon Questions : 1 Ecrire le code de la fonction récursive pair(n) ; 2 Ecrire le code de la fonction récursive impair(n) ; 3 Donner la trace d exécution pour calculer pair(6) 4 Donner la trace d exécution pour calculer impair(8) Programmation en Python 2ème année CPGE GSR 2014-2015 12/ 24

Trace d exécution d une fonction récursive Principe de fonctionnement L exécution d une fonction récursive est basée sur une pile de la mémoire vive La manipulation de cette zone mémoire appelé pile est similaire à la structure données pile traitée cours de la première année On empile les appels successifs dans une pile (LIFO : Last In First Out) Attention il faut être sur que la fonction se termine Considérons par exemple cette fonction proche de la factorielle : Une fonction f (n) = ( 1 si n = 0 n f (n + 1) si n > 0 Que vaut f(4)? Programmation en Python 2ème année CPGE GSR 2014-2015 13/ 24

Trace d exécution pour calculer 3! Phase 1 : Empiler les apples PILE PILE fact(2) = 2*fact(1) fact(3) = 3*fact(2) fact(3) = 3*fact(2) - Appel de fact(3) : retourne 3*fact(2) - Appel de fact(3) : retourne 3*fact(2) - Appel de fact(2) retourne 2*fact(1)=2 Programmation en Python 2ème année CPGE GSR 2014-2015 14/ 24

Trace d exécution pour calculer 3! Phase 1 : Empiler les apples PILE PILE fact(0) = 1 fact(1) = 1*fact(0) fact(2) = 2*fact(1) fact(3) = 3*fact(2) fact(1) = 1*fact(0) fact(2) = 2*fact(1) fact(3) = 3*fact(2) - Appel de fact(3) : retourne 3*fact(2) - Appel de fact(2) : retourne 2*fact(1) - Appel de fact(1) : retourne 1*fact(0) - Appel de fact(3) : retourne 3*fact(2) - Appel de fact(2) retourne 2*fact(1)=2 - Appel de fact(1) : retourne 1*fact(0) - Appel de fact(0) retourne 1 Programmation en Python 2ème année CPGE GSR 2014-2015 15/ 24

Trace d exécution pour calculer 3! Phase 2 : Dépiler les apples PILE fact(1) = 1*fact(0)=1*1=1 fact(2) = 2*fact(1) fact(3) = 3*fact(2) - Appel de fact(3) : retourne 3*fact(2) - Appel de fact(2) : retourne 2*fact(1) - Appel de fact(1) : retourne 1*fact(0)= 1 - Appel de fact(0) : retourne 1 Programmation en Python 2ème année CPGE GSR 2014-2015 16/ 24

Trace d exécution pour calculer 3! Phase 2 : Dépiler les apples PILE fact(2) = 2*fact(1)=2*1=2 fact(3) = 3*fact(2) - Appel de fact(3) : retourne 3*fact(2) - Appel de fact(2) : retourne 2*fact(1)=2*1=2 - Appel de fact(1) : retourne 1*fact(0)= 1 - Appel de fact(0) : retourne 1 Programmation en Python 2ème année CPGE GSR 2014-2015 17/ 24

Trace d exécution pour calculer 3! Phase 2 : Dépiler les apples PILE fact(3) = 3*fact(2)=3*2=6 - Appel de fact(3) : retourne 3*fact(2)=3*2=6 - Appel de fact(2) : retourne 2*fact(1)=2*1=2 - Appel de fact(1) : retourne 1*fact(0)= 1 - Appel de fact(0) : retourne 1 Programmation en Python 2ème année CPGE GSR 2014-2015 18/ 24

Trace d exécution pour calculer 3! Phase 2 : Dépiler les apples PILE - On dépile le dernier appel (fact(3)) - Le résultat retourné est 6 Programmation en Python 2ème année CPGE GSR 2014-2015 19/ 24

Complexité d une fonction récursive Complexité d une fonction récursive Limitation de la récursivité en Python La complexité d une fonction récursive représente le côut de cette fonction, à savoir le nombre d opérations élémentaires qu elle effectue ou son occupation mémoire totale La notion de complexité sera présentée plus en détail dans le prochain chapitre On considère la suite (u n) suivante, qui calcule une approximation de 3 ( U0 = 2 U n = 1 2 (U n 1 + 3 U n 1 ) En Python, on peut écrire la fonction récursive u qui retourne la valeur U n def u(n) : if n==0 : return 2 else : r=u(n-1) return 05*(r+3/r) On note C(n) le nombre d opérations arithmétiques (addition, multiplication et division) effectue par la fonction u(n) (avec n :l argument de la fonction u) Programmation en Python 2ème année CPGE GSR 2014-2015 20/ 24

Complexité d une fonction récursive Complexité d une fonction récursive Limitation de la récursivité en Python En suivant la définition de la fonction u, on obtient les deux équations suivantes : C(0) = 0 C(n) = C(n 1) + 3 En effet, dans le cas n = 0, on ne fait aucune opération arithmétique Et dans le cas n > 0, on fait d une part un appel récursif sur la valeur n 1, d où C(n 1) opérations, puis trois opérations arithmétiques (une multiplication, une addition et une division) Il s agit d une suite arithmétique de raison 3, dont le terme général est : C(n) = 3n Donc, on conclut que la complexité de la fonction récursive u est O(n) Programmation en Python 2ème année CPGE GSR 2014-2015 21/ 24

Complexité d une fonction récursive Complexité d une fonction récursive Limitation de la récursivité en Python Si en revanche on avait écrit la fonction u plus naïvement, avec deux appels récursifs u(n-1), c est-à-dire : def u(n) : if n==0 : return 2 else : return 05*(u(n-1)+3/u(n-1)) alors les équations définissant C(n) seraient les suivantes : : C(0) = 0 C(n) = C(n 1) + C(n 1) + 3 En effet, il convient de prendre en compte le coût C(n 1) des deux appels à u(n 1) Il s agit d une suite arithmético-géométrique, dont le terme général est : C(n) = 3(2 n 1) Donc, la complexité de la fonction récursive u devient O(2 n ) Programmation en Python 2ème année CPGE GSR 2014-2015 22/ 24

Comparaison de complexité Complexité d une fonction récursive Limitation de la récursivité en Python La comparaison de complexité entre un algorithme récursif et un algorithme itératif repose sur deux aspects de l évaluation : 1 Compelexité spatiale : on mesure l espace mémoire occupée par les variables 2 complexité temporelle : on mesure le nombre d opérations Complexité temporelle (CT) La taille mémoire occupée par une fonction itérative est inférieure à celle utilise par une fonction récursive, en raison des appels successifs dans une cette dernière Exemple : CS(fact Iter) = O(1) < CS(fact Rec) = O(n) Complexité temporelle La même remaque pour la complexité temporelle, en effet le coût d execution d une fonction itérative est généralement inferieure au temps d une exécution d une fonction récursive pour le même problème Exemple : CT (Fibo Iter) = O(n) < CT (Fibo Rec) = O(2 n ) Programmation en Python 2ème année CPGE GSR 2014-2015 23/ 24

Limitation de la récursivité en Python Complexité d une fonction récursive Limitation de la récursivité en Python Limitation de la récursivité en Python Le langage Python limite, arbitrairement, le nombre d appels imbriqués à 1000 Une fonction qui fait plus de 1000 appels récursifs provoque une erreur Exemple : >>>def fact(n) : if n==0 : return 1 else : return n*fact(n-1) >>>fact(1005) RuntimeError : maximum recursion depth exceeded Il existe de nombreuses situations où l on sait que le nombre d appels sera bien inférieur à 1000 Programmation en Python 2ème année CPGE GSR 2014-2015 24/ 24