Thème 1 : la récursivité

Documents pareils
STAGE IREM 0- Premiers pas en Python

1 Recherche en table par balayage

TP 1. Prise en main du langage Python

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

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

Initiation à l algorithmique

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)

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

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

Introduction à MATLAB R

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

Chapitre 7. Récurrences

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

Logiciel Libre Cours 3 Fondements: Génie Logiciel

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

Présentation du langage et premières fonctions

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

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

Rappels sur les suites - Algorithme

Cours Informatique Master STEP

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

Perl Orienté Objet BioPerl There is more than one way to do it

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

Découverte de Python

Conventions d écriture et outils de mise au point

Algorithmique et Programmation, IMA

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

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

Licence Sciences et Technologies Examen janvier 2010

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

Compression Compression par dictionnaires

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


Algorithmes récursifs

Recherche dans un tableau

Évaluation et implémentation des langages

Chapitre 2 Le problème de l unicité des solutions

Cours d algorithmique pour la classe de 2nde

MIS 102 Initiation à l Informatique

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

Initiation à la programmation en Python

Corrigé des TD 1 à 5

Les arbres binaires de recherche

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

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

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

Capacité d un canal Second Théorème de Shannon. Théorie de l information 1/34

Représentation d un entier en base b

Utilisation d objets : String et ArrayList

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Cours de Génie Logiciel

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

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

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

Rappels Entrées -Sorties

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

Organigramme / Algorigramme Dossier élève 1 SI

Plus courts chemins, programmation dynamique

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

OCL - Object Constraint Language

1 TD 2 : Construction d'une chier Acrobat et envoi par

TP : Gestion d une image au format PGM

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Protection individuelle

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

«Dire et écrire» pour réaliser une composition en travail collaboratif en géographie. Agnès Dullin, lycée J. Racine 20 rue du Rocher, Paris

Algorithmique, Structures de données et langage C

Intelligence Artificielle Planification

Gnuplot. Chapitre Lancer Gnuplot. 3.2 Options des graphes

R, Bonnes pratiques. Christophe Genolini

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

Calcul Formel et Numérique, Partie I

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

Programmation C. Apprendre à développer des programmes simples dans le langage C

MATLAB : COMMANDES DE BASE. Note : lorsqu applicable, l équivalent en langage C est indiqué entre les délimiteurs /* */.

Cours 1 : Qu est-ce que la programmation?

Quelques Algorithmes simples

Support de TD ArcGIS Introduction à l automatisation et au développement avec ArcGIS 10.1 JEAN-MARC GILLIOT e année ingénieur

Introduction à l algorithmique et à la programmation (Info 2)

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

1 Lecture de fichiers

Cryptographie RSA. Introduction Opérations Attaques. Cryptographie RSA NGUYEN Tuong Lan - LIU Yi 1

UE Programmation Impérative Licence 2ème Année

Solutions du chapitre 4

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

NIMEGUE V3. Fiche technique 3.07 : Sauvegarde / Restauration manuelle

Initiation à la Programmation en Logique avec SISCtus Prolog

Algorithmique et programmation : les bases (VBA) Corrigé

IMAGES NUMÉRIQUES MATRICIELLES EN SCILAB

Chapitre 10. Les interfaces Comparable et Comparator 1

Cryptographie. Cours 3/8 - Chiffrement asymétrique

Java Licence Professionnelle CISII,

Certificat Big Data - Master MAthématiques

Cours 1 : La compilation

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

avec des nombres entiers

3. SPÉCIFICATIONS DU LOGICIEL. de l'expression des besoins à la conception. Spécifications fonctionnelles Analyse fonctionnelle et méthodes

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

Transcription:

Thème 1 : la récursivité «To understand recursion, you must understand recursion.» Inconnu 1 Rappels sur les fonctions 1.1 Qu est-ce qu une fonction? Définition. Une fonction est une séquence d instructions que l on regroupe sous un même nom ; en général une fonction comporte des variables ou paramètres d entrée. L appel de la fonction consiste en l exécution de la séquence d instruction pour des valeurs des paramètres d entrée (arguments) ; cet appel retourne une valeur de sortie. Pour définir nos fonctions nous utiliserons du pseudo-code ou la syntaxe du langage Python rappelée ci-dessous. Définition de la fonction : def mafonction(x1,...,x) : """commentaires""" instruction 1... instruction n return sortie x1 val1,, x val }{{} Entrées ou arguments instruction 1 instruction 2... instruction n sortie Appel de la fonction : mafonction(val1,...,val) Exercice 1. On définit une fonction puissance2(n) dont le paramètre est un entier n et qui retourne 2 n. Pseudo-code Fonction : puissance2(n). Entrée : un entier n Sortie : l entier 2 n k = 0 p = 1 Tant que k < n : p = 2p k = k + 1 Retourner p Justifier la terminaison de la fonction ci-dessus. Justifier qu elle est correcte. Python 1

1.2 Variables locales et variables globales Définition. Les variables utilisées dans le corps d une fonction sont des variables locales. Elles sont affectées au moment de l appel de la fonction et sont détruites à la sortie. Les paramètres d entrés subissent le même traitement. On peut définir des fonctions et utiliser des variables locales dans ces fonctions sans se préoccuper de savoir si elles existent ailleurs dans le script. Les affectations temporaires à l appel de la fonction ne risquent pas d interférer avec les autres variables. Les variables utilisées à l extérieur d une fonction sont des variables globales. Une fonction peut modifier une variable globale à condition de la déclarer comme telle dans le corps de la fonction : on utilise l instrution global. 1.3 Fonctions et procédures en Python Fonctions et procédures ont la même syntaxe ; on les distinguent de la manière suivante : Une fonction prend des arguments et retourne une valeur ; Une procédure réalise une action : affichage, écriture d un fichier, ouverture d une fenêtre graphique, modification d un objet... Ces changements perdurent après l appel de la procédure. Elle retourne la valeur one. Exercice 2. Écrire une procédure Python echange(l,i,j) dont les paramètres sont : L de type list, i et j de type int. La procédure échange L[i] et L[j]. On peut naturellement envisager des objets de type mixte. D un point de vue théorique nous travaillerons essentiellement avec des fonctions pures. 1.4 Exercice : la factorielle itérative 1. Écrire une fonction fact(n) dont l argument d entrée est un entier n. La fonction retourne la valeur n! calculée à l aide d une boucle for. 2. Étudier la terminaison et la correction de votre fonction. 2

2 Fonctions récursives 2.1 Généralités Définition. Une fonction récursive est une fonction qui contient au moins un appel à elle-même. Un langage récursif est un langage dans lequel on peut programmer des fonctions récursives. Python est un langage récursif. Exemple. Voici une définition récursive pour fonction puissance2(n) dont le paramètre est un entier n et qui retourne 2 n. On part du constat que : puissance2(n) = 2 n = 2 2 n 1 = 2 puissance2(n 1) Pseudo-code Fonction : puissance2(n). Entrée : un entier n Sortie : l entier 2 n Si n == 0 : Retourner 1 Sinon : Retourner 2 puissance2(n 1) Python Que se passe-t il lors de l appel de puissance2(n)? Pour s assurer de la terminaison d une fonction récursive, on doit respecter les règles suivantes : Règles. La fonction doit contenir un ou plusieurs cas de base ne comportant pas d appel récursif. Dans la fonction puissance2 : c est le cas n = 0. Les appels de la fonction se font des arguments plus simple pour conduire aux cas de base. Dans l appel de puissance2(n) : les arguments successifs sont n 1 > n 2 > > 0. Voici deux mauvaises versions de la fonction puissance2(n). Pourquoi? Mauvaise version 1. def puissance2(n) : return 2*puissance2(n-1) Mauvaise version 2. def puissance2(n) : if n==0 : return 1 else : return 4*puissance2(n-2) 3

2.2 Exemples simples de fonctions récursives 2.2.1 La factorielle récursive Exercice 3. Écrire une fonction récursive factrec(n) pour le calcul de n!. Donner le nombre d appel et le nombre de multiplication pour le calcul de n!. 2.2.2 L exponentiation rapide L exponentiation rapide s appuie sur un algorithme que nous présentons dans le cas particulier du calcul de q 25. Pour calculer q 25, on calcule q 12 q 12 q. Pour calculer q 12, on calcule q 6 q 6. Pour calculer q 6, on calcule q 3 q 3. Pour calculer q 3, on calcule q 2 q Pour calculer q 2, on calcule q q. Pour calculer q, on calcule q 1. ombre de multiplication nécessaires : Écrire une fonction Python récursive expo(q,n) qui calcule q n en s appuyant sur le principe : ( n ) 2 q q n 2 si n est pair = ( ) 2 q. q n 1 2 sinon. Exercice 4. Analyse de l algorithme. 1. Justifier qu un appel de expo(q,n) se termine. 2. Justifier qu un appel de expo(q,n) retourne toujours q n. 3. Complexité de l algorithme. otons C(n) le nombre de multiplications lors d un appel de expo(q,n) pour n 1. (a) Justifier que C(n) = C ( n 2 ) + rn avec r n à expliciter en fonction de n. (b) Justifier que log 2 (n) C(n) 2 log 2 (n) + 1. Comment qualifier la complexité de la fonction? (c) Comparer sous Python avec la fonction time le temps d exécution de puissance(2,n) et expo(2,n) pour de grandes valeurs de n. 4

2.3 La suite de Fibonacci : limite de la récursivité La multiplication des lapins. Vous allez faire l acquisition d un couple de bébés lapins. Au bout d un mois ce couple est adulte. Le mois suivant il donne naissance à un couple de bébés lapins : vous avez maintenant 4 lapins. Puis chaque couple engendre tous les mois un nouveau couple deux mois après sa naissance. ous avons le schéma ci-contre : Légende : m : bébé lapin ; M : lapin adulte. Mois 0. m m Mois 1. M M Mois 2. M M m m Mois 3. M M M M m m Mois 4. M M M M M M m m m m otons F le nombre de lapins que l on a au bout du -ième mois. On convient que : F 0 = 2. ous avons donc F 1 = 2 puis F 2 = 4 et F 3 = 6. Plaçons nous au mois + 2, nous aurons tous les couples de lapins du mois précédent (le mois + 1) et toutes les progénitures des couples de lapins du mois. ous avons donc la relation : F +2 = F +1 + F Écrire deux fonctions Python FiboIt() et FiboRec() pour le calcul de F. La première est rédigée de manière itérative, la seconce récursive. FiboIt() FiboRec() Exercice 5. 1. Analyse de l algorithme itératif. Estimer la complexité de l algorithme itératif. 2. Analyse de l algorithme récursif. (a) Dénombrer les appels de la fonction FiboRec() pour l argument = 5. (b) On note A() le nombre d appels récursifs de FiboRec(). Justifier que pour 3, A() Comment qualifier cette complexité? ( ) 3. 2 5

3 Récursivité et tableaux : une première approche «divide ut regnes.» Jules César, apoléon... Dans cette partie on reprend quelques éléments d algorithmique sur les listes (ou tableaux). On met en évidence la stratégie du diviser pour régner qui cherche à résoudre un problème en appliquant les trois principes suivants : Diviser : c est découper le problème en sous-problèmes identiques mais sur des entrées de tailles inférieures. Régner : c est pouvoir résoudre tous les sous-problèmes soit directement (cas de base), soit de manière récursive. Combiner : c est résoudre le problème initial à partir des solutions des sous-problèmes. On applique cette méthode sur deux problèmes simples ayant trait aux tableaux (ou listes). 3.1 Problème 1 : le maximum récursif On cherche à résoudre le problème de recherche du maximum d une liste L. La stratégie du diviser pour régner suggère l approche suivante : Diviser : on découpe la liste en deux sous-listes de taille égale (ou presque) pour lesquelles on se pose le problème du maximum ; Régner : si une sous-liste ne contient qu un seul élément son maximum est cet élément, sinon on le trouve de manière récursive ; Combiner : ayant trouvé le maximum des deux sous-listes, on cherche la plus grande des deux valeurs. L = } {{ }} {{ } maxi(l1) maxi(l2) maxi(l)=max(maxi(l1),maxi(l2)) Fonction récursive maxi(l,i,j) qui cherche le maximum de la liste L entre les indices i et j. Analyse de la complexité de l algorihtme (ombre d appels récursifs, nombre de comparaisons) : vérifier que la complexité est en O(n). 6

3.2 Problème 2 : recherche dichotomique récursive On cherche à résoudre le problème de recherche d un élément x dans une liste L d objets triés par ordre croissant (par exemple : une liste de nombres, une liste de mot pour l ordre alphabétique). On applique encore la stratégie du diviser pour régner Diviser : on se place au milieu (ou presque) de la liste (position d indice m) ; on découpe alors la liste en deux sous-listes. Régner : si une sous-liste ne contient qu un seul élément la réponse est obtenue en testant l égalité avec x, sinon la réponse pour une sous-liste est obtenue de manière récursive. Combiner : on compare L[m] et x : s ils sont égaux on a trouvé, si L[m]>x on cherche dans la sous-liste à gauche, sinon on cherche dans la sous-liste à gauche. L = }{{} L[m] = x? Fonction récursive rechdicho(l,x,i,j) qui cherche l élément x dans liste triée L entre les indices i et j. La fonction retourne l indice de x s il est dans la liste et False sinon. Analyse de la complexité de l algorihtme (ombre d appels récursifs, nombre de tests d égalité) : vérifier que la complexité est en O(log 2 (n)). 7

4 Transformée de Fourier La transformée de Fourier discrète est un outil majeur en traitement du signal et intervient dans des domaines très variés. 4.1 Un contexte : spectre d un signal périodique Un signal f, de période T, se développe en série de Fourier sous la forme : f(t) = + n= c n e 2iπ n t T où c n désignent les coefficients de Fourier qui se calculent sous la forme intégrale : c n = 1 T ( n Le spectre de f est l ensemble des couples n) T, c d un signal périodique. n Z T 0 f(t)e 2iπ n t T d t. La détermination du spectre est un élément important de l étude On suppose connue la période T du signal ainsi qu un nombre fini de valeurs du signal régulièrement espacés sur une période : ( y k = f k T ) avec k = 0, 1, 2 1 La méthode des rectangle nous permet d approcher les coefficients de Fourier par la somme ci-dessous : 1 1 y k e 2iπ n k k=0 cn On vérifie que l approximation est essentiellement valable pour 2 n 2 impair). C est sur le calcul de ces coefficients que se concentre notre étude. 1 (ou un intervalle centré si est 4.2 Transformée de Fourier discrète Définition. ous fixons un entier > 0 et nous posons ω = e 2iπ. L application qui a une famille (y k ) 0 k 1 de nombres complexes associe la famille (Y n ) 0 n 1 définie par : s appelle la transformée de Fourier discrète. Y n = 1 k=0 y k ω nk Dans le calcul des coefficients de Fourier (cas pair) nous avons donc : Y n si 0 n < c n 2 Y n+ si 2 n < 0 8

Calcul direct. 1. Écrire une fonction Python TFD(y) qui prend une liste y en entrée et retourne la liste Y obtenue par transformée de Fourier discrète des coefficients de y. La somme est calculée de manière itérative. 2. Estimer le nombre d additions et de multiplications nécessaires pour ce calcul. ombre d opérations? Comment qualifier la complexité? 4.3 Transformée de Fourier rapide ous présentons dans cette dernière partie un algorithme connu sous le nom de transformée de Fourier rapide (TFR) ou fast Fourier transform (FFT) qui va nettement faire baisser le coût de calcul de la tranformée de Fourier discrète. La méthode : principe général. C est une autre illustration du paradigme diviser pour régner. On suppose que est un nombre pair, soit = 2m. 1. ous avons pour 0 n <, Y n = P n + ω n I n avec : P n = y 0 + y 2 ω 2n + + y 2m 2ω (2m 2)n et I n = y 1 + y 3 ω 2n + + y 2m 1ω (2m 2)n On remarque alors les relations : P n+m = P n et I n+m = I n. Il suffit donc de calculer P n et I n pour n = 0...m 1 et remarquer que ω (n+m) = ω n pour former : Y n = P n + ω n I n et Y n+m = P n + ω (n+m) I n = P n ω n I n 2. En se rappelant que ω 2 = ω m, une lecture attentive des nombres P n et I n nous permet d écrire : (P n ) 0 n<m 1 = TFD(y 0, y 2,, y 2m 2 ) et (I n ) 0 n<m 1 = TFD(y 1, y 3,, y 2m 1 ). L algorithme. On décrit le principe d une fonction FFT(y,) qui prend en entrée une liste y de taille et retourne la transformée de Fourier discrète de y. On suppose que est une puissance de 2. Diviser : on découpe la liste en deux sous-listes, celle des termes de rang pair et celle des termes de rang impair. Régner : si une sous-liste ne contient qu un seul élément le résultat est immédiat, sinon on le trouve de manière récursive ; Combiner : ayant trouvé la TFD des deux sous-listes, on combine les listes selon le point 1 de la méthode décrite ci-dessus. 9

Fonction FFT(y,). Analyse de la complexité. 10