Corrigés des exercices sur les fonctions récursives

Documents pareils
Corrigé des exercices sur les références

Premiers Pas en Programmation Objet : les Classes et les Objets

Corrigés des premiers exercices sur les classes

Utilisation d objets : String et ArrayList

Programme Compte bancaire (code)

Java Licence Professionnelle CISII,

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

Langage Java. Classe de première SI

ACTIVITÉ DE PROGRAMMATION

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

TP, première séquence d exercices.

Projet de programmation (IK3) : TP n 1 Correction

Programmer en JAVA. par Tama

Chapitre 10. Les interfaces Comparable et Comparator 1

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

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

TD/TP PAC - Programmation n 3

Package Java.util Classe générique

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

Solutions du chapitre 4

Corrigé des exercices avancés sur les structures récursives

INF 321 : mémento de la syntaxe de Java

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

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Exercices sur les interfaces

Cours 1: Java et les objets

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

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

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

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

1. Langage de programmation Java

Remote Method Invocation Les classes implémentant Serializable

Tp 1 correction. Structures de données (IF2)

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

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

as Architecture des Systèmes d Information

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

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

Environnements de développement (intégrés)

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

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

Auto-évaluation Programmation en Java

Programmation Objet Java Correction

Classe Interne, Anonyme & Enumération

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

Un ordonnanceur stupide

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

Programmation avec des objets : Cours 7. Menu du jour

Synchro et Threads Java TM

Prendre le marteau, le tableau, le mètre, le crayon, la ficelle, le clou, la pointe ;

Les arbres binaires de recherche

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Gestion distribuée (par sockets) de banque en Java

Langage à objets : JAVA (1)

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Java 1.5 : principales nouveautés

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

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)

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

Cours de Systèmes d Exploitation

STAGE IREM 0- Premiers pas en Python

Introduction au langage Java

Derrière toi Une machine virtuelle!

Objets et Programmation. origine des langages orientés-objet

Flux de données Lecture/Ecriture Fichiers

RMI le langage Java XII-1 JMF

PROGRAMMATION PAR OBJETS

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.


Bases du langage. Historique Applications et applets Éléments de base du langage Classes et objets Les exceptions

Conventions d écriture et outils de mise au point

Programmation par les Objets en Java

Développement Logiciel

Calcul Parallèle. Cours 5 - JAVA RMI

Notes de cours Practical BigData

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Threads. Threads. USTL routier 1

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Chapitre V. Les classes : Object, Vector, etc.

7 Développement d une application de MapReduce

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

Généralités sur le Langage Java et éléments syntaxiques.

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

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

TP1 : Initiation à Java et Eclipse

Remote Method Invocation (RMI)

Les bases de l informatique et de la programmation. École polytechnique

Arbres binaires de recherche

Licence Sciences et Technologies Examen janvier 2010

Programmation Par Objets

Lier Erlang avec d autres langages de programmation

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

Une introduction à Java

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

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

Recherche dans un tableau

Durée estimée :1 journée Date de la réalisation : Description Fournisseur Référence Nombre PU HT LM35CZ, LM35AZ LM35DZ

Le langage C. Séance n 4

Master d Informatique Corrigé du partiel novembre 2010

Transcription:

Corrigés des exercices sur les fonctions récursives Exercice 7.1.1 sous-programmes récursifs Pour chacun des sous-programmes, nous donnerons les paramètres en précisant le paramètre sur lequel porte la récurrence, le cas de base (valeur de ce paramètre pour lequel le calcul s arrête) et la variation qui affecte le paramètre à chaque appel récursif. 1. Ecrire un sous-programme récursif qui calcule la somme des n premiers carrés. Par exemple, si n vaut 3, ce sous-programme calculera 1 2 + 2 2 + 3 2. Ce sous programme n est défini que pour un n supérieur à 0. Un seul paramètre n, qui doit être positif. cas de base : n=1. variation de n à chaque appel : -1 2. Ecrire un sous-programme récursif qui calcule la somme des éléments positifs d un tableau. Deux paramètres : un tableau d entiers tab et un indice ind. Le but de la fonction est de renvoyer la somme des entiers positifs du tableau compris entre ind et la fin du tableau. Pour avoir le résultat pour tout le tableau, il faut appeler la fonction avec pour indice 0. cas de base : ind=tab.length. 3. Ecrire un sous-programme récursif qui vérifie si une chaîne de caractère est un palindrôme. Pour cela vous utiliserez les méthodes charat et length de la classe String. s.charat(i) renvoie le ième caractère de la chaîne s et s.length() renvoie la longueur de s. Deux paramètres : une chaîne s et un indice ind cas de base : ind=s.length()/2. En effet, à chaque appel, on va vérifier la correspondance de 2 caractères. Il est inutile de parcourir le tableau en entier. 4. Ecrire un sous-programme récursif qui réarrange les éléments d un tableau en ordre inverse. Deux paramètres : une tableau d entiers tab et un indice ind cas de base : ind=tab.length/2. En effet, à chaque appel, on va inverser 2 caractères. Il ne faut surtout pas faire un parcours complet du tableau, sinon chaque élément est changé de place deux fois et revient à sa position d origine. 5. Ecrire un sous-programme récursif qui calcule la valeur numérique d une chaîne de caractères composée de chiffres. Ici encore, deux paramètres : la chaîne et un indice. Cette fois, nous parcourons la chaîne de droite à gauche, ce qui simplifie la tâche. Cas de base : 0. Pas de calcul : -1. 1

Si cela vous aide, vous pouvez commencer par chercher une formule qui exprime le calcul récursif à effectuer. Pour les opérations sur les tableaux, vous pourrez vous inspirer de l exemple affichageinverse de la section 13.3.1 du cours. Remarquez comment est fait le traitement d exception dans cet exemple ; c est un peu différent de ce que nous avons vu jusqu ici. class Exo20_1{ static int sommepremierscarres(int n) throws HorsDomaine{ if (n==1){ return 1; else if (n>0){ return (n*n)+sommepremierscarres(n-1); static int sommepositifs(int[] tab, int indice) throws HorsDomaine{ if (indice >= tab.length){ return 0; else if (indice>=0){ if (tab[indice]>0){ return tab[indice]+sommepositifs(tab, indice+1); else{ return sommepositifs(tab, indice+1); static boolean palindrome(string s, int nieme) throws HorsDomaine{ if (nieme > s.length() /2){ return true; if ((nieme<0) (nieme > s.length() /2)){ return (s.charat(nieme) == s.charat(s.length()-nieme-1)) && palindrome(s, nieme+1); static void ordreinverse(int[] tab, int indice) throws HorsDomaine{ if(indice<0){ else if (indice < tab.length /2){ int tampon; tampon = tab[indice]; tab[indice] = tab[tab.length-indice-1]; tab[tab.length-indice-1]=tampon; ordreinverse(tab,indice+1); static int valeurdechar(char c) throws HorsDomaine{ if (c == 0 ){ return 0; else if (c == 1 ){ 2 NFA031 c CNAM 2012

return 1; else if (c == 2 ){ return 2; else if (c == 3 ){ return 3; else if (c == 4 ){ return 4; else if (c == 5 ){ return 5; else if (c == 6 ){ return 6; else if (c == 7 ){ return 7; else if (c == 8 ){ return 8; else if (c == 9 ){ return 9; static int valeurnumerique(string s, int indice) throws HorsDomaine{ char c = s.charat(indice); if (indice == 0){ return valeurdechar(c); else{ return (valeurnumerique(s, indice-1) *10 + valeurdechar(c)); public static void main(string[] args) throws HorsDomaine{ int[] test = {1, 5, -5, 10, -10, 3; Terminal.ecrireIntln(sommePremiersCarres(3)); Terminal.ecrireIntln(sommePremiersCarres(4)); Terminal.ecrireIntln(sommePositifs(test,0)); Terminal.ecrireBooleanln(palindrome("ada",0)); Terminal.ecrireBooleanln(palindrome("callac",0)); Terminal.ecrireBooleanln(palindrome("calioplac",0)); for (int i=0; i<test.length; i++){ Terminal.ecrireInt(test[i]); Terminal.ecrireChar( ); Terminal.sautDeLigne(); ordreinverse(test,0); for (int i=0; i<test.length; i++){ Terminal.ecrireInt(test[i]); Terminal.ecrireChar( ); Terminal.sautDeLigne(); Terminal.ecrireIntln(valeurNumerique("1234",3)); class HorsDomaine extends Exception{ static HorsDomaine typique = new HorsDomaine(); NFA031 c CNAM 2012 3

Exercice 7.1.2 Fibonacci Ecrire une fonction qui calcule les valeurs de la série de Fibonacci, définie par : u 0 = 0 u 1 = 1 u n = u n 1 + u n 2 Ecrivez cette fonction sous forme itérative et sous forme récursive. Laquelle des deux variantes est préférable ici? class Exo20_2{ static int fiboiteratif(int n){ if ((n == 0) (n == 1)){ return n; else{ int moinsdeux = 0; int moinsun = 1; int nouveau; for (int i=2; i<n; i++){ nouveau = moinsdeux + moinsun; moinsdeux = moinsun; moinsun = nouveau; return moinsdeux + moinsun; static int fiborecursif(int n){ if ((n == 0) (n == 1)){ return n; else{ return fiborecursif(n-2)+fiborecursif(n-1); public static void main(string[] args){ for (int i=5; i<20; i=i+3){ Terminal.ecrireStringln(" " + fiboiteratif(i) + " " + fiborecursif(i)); La forme récursive est plus facile à écrire et plus proche de la définition de la fonction, mais elle est moins efficace que la version itérative. Dans la version itérative, une valeur de la suite u n est conservée pendant deux tours de boucles successifs (d abord dans moinsun, puis dans moinsdeux), alors que dans la version récursive, comme il n y a pas de possibilité de conserver une valeur dans une variable entre deux appels récursifs, la valeur est recalculée. Il y a un effet cumulatif. Voici par exemple les appels effectués pour le calcul de fiborecursif(5). 4 NFA031 c CNAM 2012

fibo(3) fibo(5) fibo(4) fibo(3) On voit que fiborecursif(2) est appelé trois fois, fiborecursif(1) quatre fois, etc. La version itérative ne calcule qu une fois chaque terme de la suite. Elle est donc préférable. NFA031 c CNAM 2012 5