Algorithmique et programmation 2 : Récursivité Corrigé

Documents pareils
Algorithmique et Programmation, IMA

Initiation à l algorithmique

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


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

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

Algorithmique et programmation : les bases (VBA) Corrigé

STAGE IREM 0- Premiers pas en Python

Organigramme / Algorigramme Dossier élève 1 SI

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

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

Cours de Systèmes d Exploitation

Licence Sciences et Technologies Examen janvier 2010

Cours Informatique Master STEP

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Programmation linéaire

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

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

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

Cours d Algorithmique et de Langage C v 3.0

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

Logiciel Libre Cours 3 Fondements: Génie Logiciel

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

Les structures de données. Rajae El Ouazzani

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

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

Le prototype de la fonction main()

Solutions du chapitre 4

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Corrigé des TD 1 à 5

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

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

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

Représentation d un entier en base b

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

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

Université Bordeaux 1, Licence Semestre 3 - Algorithmes et struct...

Introduction au langage C

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

Cours 1 : La compilation

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

BACCALAURÉAT GÉNÉRAL SESSION 2012 OBLIGATOIRE MATHÉMATIQUES. Série S. Durée de l épreuve : 4 heures Coefficient : 7 ENSEIGNEMENT OBLIGATOIRE

Programmation Classique en langage C

PROJET 1 : BASE DE DONNÉES REPARTIES

1 Recherche en table par balayage

Conventions d écriture et outils de mise au point

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

I. Introduction aux fonctions : les fonctions standards

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

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

Rappels sur les suites - Algorithme

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

alg - Classes, instances, objets [oo] Exercices résolus

Initiation à la programmation en Python

Les arbres binaires de recherche

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

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Traduction des Langages : Le Compilateur Micro Java

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

Chap III : Les tableaux

Programmation avec Xcas ou Python

Problèmes liés à la concurrence

4. Les structures de données statiques

Introduction à l algorithmique et à la programmation M1102 CM n 3

Chapitre 1 : Évolution COURS

La persistance des nombres

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

1 Introduction C+ + Algorithm e. languag. Algorigramm. machine binaire. 1-1 Chaîne de développement. Séance n 4

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

Cours d algorithmique pour la classe de 2nde

TRIGONOMETRIE Algorithme : mesure principale

Continuité et dérivabilité d une fonction

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

La fonction exponentielle

Quelques algorithmes simples dont l analyse n est pas si simple

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

ACTIVITÉ DE PROGRAMMATION

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

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

#include <stdio.h> #include <stdlib.h> struct cell { int clef; struct cell *suiv; };

Probabilités conditionnelles Loi binomiale

Bac Blanc Terminale ES - Février 2011 Épreuve de Mathématiques (durée 3 heures)

Algorithmique et structures de données I

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

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

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

Application 1- VBA : Test de comportements d'investissements

Examen Médian - 1 heure 30

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Algorithme. Table des matières

Programmation Objet - Cours II

Architecture des ordinateurs

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

Résolution d équations non linéaires

Introduction à MATLAB R

Programmer en JAVA. par Tama

Informatique Générale

Probabilités Loi binomiale Exercices corrigés

Transcription:

PAD INPT ALGORITHMIQUE ET PROGRAMMATION 2 Cours C, Semaine 2 août-septembre 2005 Corrigé Résumé Ce document décrit l écriture dans le langage C des éléments vus en algorithmique. Table des matières 1 Définition 2 2 Fondement mathématique 2 3 Terminaison 2 4 Récursivité terminale 3 5 Récursivité mutuelle 4 6 Récursivité en C 4 Liste des exercices Exercice 1 : Pair et impair............................................................. 4 Cours C, Semaine 2 c INPT PAD 1/5

1 Définition Définition : Un sous-programme récusif est un sous-programme dont l implémentation contient un appel à lui-même. Exemple : Fonction récursive qui calcule la factorielle : 1 Fonction factorielle(n: in Entier): Entier Est 2 -- Factorielle de n 3 -- 4 -- Nécessite : 5 -- n >= 0 6 Début 7 Si n <= 1 Alors 8 Résultat <- 1 9 Sinon 10 Résultat <- n * factorielle(n-1) 11 FinSi 12 Fin Remarque : factorielle(n-1) est l appel récursif. 2 Fondement mathématique Le corps de la fonction factorielle précédente correspond à la définition mathématique de la factorielle donnée sous forme de récurrence : { 1 si n = 0 ou n = 1 n! = n (n 1)! sinon Remarque : On pourrait mathématiquement utiliser la notation suivante pour définir la factorielle : i=n n! = i = 1 2 3... (n 1) n i=1 Elle conduirait à un sous-programme non récursif utilisant une boucle Pour. Remarque : Les définitions par récurrence (et donc les SP récursifs) sont souvent plus concises et claires que leur équivalent itératif. 3 Terminaison Danger : Il faut s assurer que les appels récursifs s arrêtent pour garantir la terminaison du programme. Régle : Un SP récursif doit toujours faire apparaître deux éléments : le cas de base où l on sait écrire le code sans nouvel appel récursif ; le cas général dans le quel on fait des appels récursifs. Cours C, Semaine 2 c INPT PAD 2/5

Terminaison : Les appels récursifs doivent porter sur un problème de taille strictement inférieure, supérieure à la taille du cas de base. Attention : Cette condition est suffisante mais pas nécessaire! Exemple : Dans le cas de la factorielle : on définit la taille du problème de factorielle(n) comme étant n ; le cas terminal correspond à n 1 (n = 0 ou 1) où la factorielle est 1 ; dans le cas général (n > 1), on utilise l appel récursif factorielle(n-1) de taille strictement inférieure (n 1 < n). 4 Récursivité terminale Définition : Une fonction est récursive terminale quand le résultat de l appel initial est directement celui du dernier appel récursif. Régle : Aucune opération n est réalisée sur le retour d un appel récursif. 1 Fonction factorielle(n: in Entier; p: in Entier): Entier Est 2 Début 3 Si n <= 1 Alors 4 Résultat <- p 5 Sinon 6 Résultat <- factorielle(n-1, n * p) 7 FinSi 8 Fin Le calcul de la factorielle de 4 donne : 1 fact(4) = f(4, 1) -> f(3, 4) -> f(2, 12) -> f(1, 24) 2 <--24-- <--24-- <--24-- <--24-- Remarque : On a : fact(4) = f(4, 1) = f(3, 4) = f(2, 12) = f(1, 24) = 24 Intérêt : Inutile de remonter les appels récursifs (gain de temps). Cette propriété peut être exploitée par certains compilateurs. Remarque : Toute fonction récursive terminale peut être réécrite simplement en utilisant une itération. 1 Fonction factorielle(a: in Entier): Entier Est 2 Variable 3 n: Entier -- équivalent de a mais modifiable! 4 Début 5 n <- a 6 Résultat <- 1 7 TantQue n > 1 Faire 8 Résultat <- n * Résultat 9 n <- n - 1 10 FinTQ 11 Fin Remarque : On constate que : Résultat est équivalent à p ; Cours C, Semaine 2 c INPT PAD 3/5

initialisée à 1, valeur à fournir lors du premier appel à factorielle ; le TantQue correspond au cas général. 5 Récursivité mutuelle Définition : On dit que deux SP sont mutuellement récursifs si si chacun des deux appels l autre (éventuellement indirectement). Plus généralement, un ensemble de SP est mutuellement récursif si la relation «f appelle g» admet un cycle : f 1 appelle...appelle f n appelle f 1. Exercice 1 La parité possède les propriétés suivantes : un nombre est pair s il est nul ou si son prédecesseur est impair ; un nombre est impair s il est non nul et si son prédecesseur est pair. Écrire deux SP qui indiquent si un entier est pair ou impair. 1 Fonction pair(n: in Entier): Booléen 2 -- Est-ce que n est pair? 3 -- Nécessite : n >= 0 4 Début 5 Si n = 0 Alors 6 Résultat <- VRAI 7 Sinon 8 Résultat <- impair(n - 1) 9 FinSi 10 Fin 11 12 Fonction impair(n: in Entier): Booléen 13 -- Est-ce que n est impair? 14 -- Nécessite : n >= 0 15 Début 16 Si n = 0 Alors 17 Résultat <- FAUX 18 Sinon 19 Résultat <- pair(n - 1) 20 FinSi 21 Fin 6 Récursivité en C Aucun changement par rapport à ce qui a été présenté en Algorithmique. Rappelons que c est return qui indique la valeur calculée par une fonction. Voici la définition de la fonction factorielle en C. 1 /* Factorielle de n. 2 * 3 * Nécessite : 4 * n >= 0 Cours C, Semaine 2 c INPT PAD 4/5

5 */ 6 int factorielle(int n) 7 { 8 if (n <= 1) { 9 return 1; 10 } 11 else { 12 return n * factorielle(n - 1); 13 } 14 } Cours C, Semaine 2 c INPT PAD 5/5