[PDF] TD n 7 - Correction



Previous PDF Next PDF


























[PDF] somme double valeur absolue

[PDF] exercice statique analytique

[PDF] cours mecanique statique pdf

[PDF] exercice statique graphique

[PDF] cours de statistique appliquée ? l'économie pdf

[PDF] statistiques ? deux variables exercices corrigés b

[PDF] exercice fréquence cumulée croissante

[PDF] suites numériques terminale bac pro

[PDF] suite numérique bac pro cours

[PDF] exercices suites numériques 1 bac pro

[PDF] suites numériques exercices corrigés terminale l p

[PDF] exercices acido basique avec correction

[PDF] exercices corrigés sur l'excrétion urinaire 5eme

[PDF] le role du rein dans l'excrétion urinaire

[PDF] exercices corrigés sur l excrétion urinaire pdf

Universit´e Paris Diderot JAVA

MASS L2 Ann´ee 2007-2008

TD n ◦7 - Correction R´ecursivit´eExercice 1Tableaux bidimensionnels ´Ecrire une m´ethodestatic int minMax(int[][] t)renvoyant le plus petit maximum de

chaque ligne de t.Correction :Il est pratique de commencer par ´ecrire une fonction auxiliaire permettant de calculer le

maximum d"une ligne.static int maxLigne(int[] t) int r=t[0]; for (int i=1; i a) r=a; return r;

On peut aussi tout ´ecrire dans une seule m´ethode, mais cel`a va ˆetre moins lisible :static int minMax(int[][] t)

int r=t[0][0]; for (int j=1; j maxi) r=maxi; return r; Dans les exercices sur la r´ecursivit´e, l"usage de boucles for est interdit!

Exercice 2R´ecursivit´e

1.´

Ecrire une m´ethode r´ecursivestatic int fact(int n)permettant de calculer la facto- rielle den.Correction :

Attention : outre l"appel r´ecursif, toutes les m´ethodes r´ecursives doivent conteinir un crit`ere d"arrˆet.

S"il n"y a pas de crit`ere d"arrˆet ou s"il n"est pas bon, on va avoir une r´ecursion `a l"infini, qui va

provoquer une erreur `a l"ex´ecution. C"est par exemple le cas pour le code suivant :static void stupide()

stupide();

o`ustupide()fait des appels en cascade d"elle-mˆeme sans jamais s"arrˆeter.static int fact(int n)

if (n==0) return 1; //crit`ere d"arr^et return n*fact(n-1); //appel r´ecursif

2.´

Ecrire une m´ethode r´ecursivestatic binome(int n, int p)permettant de calculer un coefficient binomial.Correction : static int binome(int n, int p) if (n<0 || p<0 || p>n) return 0; if (p==0 || p==n) return 1; return binome(n-1, p-1)+binome(n-1, p);

3.En remarquant quexp= (x(p/2))2sipest pair, etxp=x(x(p/2))2sipest impair, ´ecrivez

une m´ethodestatic exp(double x, int n)calculantxnCorrection :

On appelle cet algorithmeexponentiation rapide.2

static double exp(double x, int n) if (n==0) return 1; if (n%2==0) double a=exp(x, n/2); return a*a; else double a=exp(x, n-1/2); return a*a*x;

Ainsi, pour calculer 2

37, on aura des appels `aexp(2, 37),exp(2, 18),exp(2, 9),exp(2, 4),

exp(2, 2),exp(2, 1),exp(2, 0). En revanche si on utilisait une exponentiation na¨ıve :static double expNaive(double x, int n) if (n==0) return 1; return x*exp(x, n-1);

le mˆeme calcul n´ecessiterait des appels `aexp(2, 37),exp(2, 36),exp(2, 35), ...,exp(2, 0), ce

qui est beaucoup plus couteux.

Dans le second cas, le calcul dexna une complexit´e lin´eaireO(n), alors que dans le premier cas,

on peut montrer qu"elle est logarithmique (O(log(n))).?

Exercice 3R´ecursivit´e et tableaux

1.´

Ecrire une m´ethode r´ecursivestatic int sum(int n, int[] t)calculant la somme des

npremiers ´el´ements det.Correction :Pour faire la somme desnpremiers ´el´ements, on prend la somme desn-1 premiers,

et on lui ajoute le n `eme(c"est-`a-diret[n-1]).static int sum(int n, int[] t) if (n==0) return 0; return t[n-1]+sum(n-1, t);

2.En utilisant une m´ethode r´ecursive auxiliaire,´ecrire une m´ethodestatic affiche(int[] t)

permettant d"afficher le tableaut.Correction :

Commen¸cons par ´ecrire une m´ethode permettant d"afficher lesnpremiers ´el´ements d"un tableau.

Pour afficher lesnpremiers ´el´ements, on affiche lesn-1 premiers, puis on affiche le n`eme.static void afficheN(int n, int[] t)

if (n==0) return;3 afficheN(n-1, t);

System.out.println(t[n-1]);

il ne reste plus alors qu"`a afficher lest.lengthpremiers ´el´ements detpour l"afficher enti`erement.static void affiche(int[] t)

afficheN(t.length, t);

3.Modifier la m´ethode pr´ec´edente pour que le tableau soit affich´e dans l"ordre inverse.

Correction :

Il suffit, dansafficheNd"afficher l"´el´ement courantavantd"afficher ce qui pr´ecede :static void afficheN(int n, int[] t)

if (n==0) return;

System.out.println(t[n-1]);

afficheN(n-1, t); Exercice 4On parle de r´ecursivit´ecrois´eelorsque deux fonctions s"appellent l"une l"autre r´ecursivement. Les fonctions suivantes sont cens´ees donner la parit´e d"un nombre entier : cela sera-t-il le cas pour toutes les valeurs enti`eres positives?import fr.jussieu.script.Deug; class PairImpair{ static boolean pair (int n){ if (n==0) return true; else return impair(n-1); static boolean impair (int n){ if (n==1) return true; else return pair(n-1); public static void main (String[] args) { int p = Deug.readInt(); Deug.println("pair? "+ pair(p) + " impair? " + impair(p)); }4

Correction :Regardons ce qui se passe lors d"un appel `apair(3). En suivant l"ex´ecution du code pas

`a pas, on va avoir les appels suivants : pair(3) impair(2) pair(1) impair(0) pair(-1) impair(-2)

La condition d"arrˆet n"est donc pas bonne. Un autre ´el´ement montrant que ce code ne peut pas

marcher est qu"aucune des deux m´ethodes ne peut jamais renvoyerfalse.

On pourrait les modifier de la mani`ere suivante pour qu"elles fonctionnent :import fr.jussieu.script.Deug;

class PairImpair{ static boolean pair (int n){ if (n==0) return true; else return impair(n-1); static boolean impair (int n){ if (n==0) return false; else return pair(n-1); public static void main (String[] args) { int p = Deug.readInt(); Deug.println("pair? "+ pair(p) + " impair? " + impair(p));

Exercice 5Tours de Hano¨ı

On dispose denplateaux de taille diff´erentes, et de 3 tiges, num´erot´ees de 0 `a 2.

Initialement, tous les plateaux sont situ´es sur la tigei. Le but est de les transf´erer sur la

tigej, en respectant les r`egles suivantes :-On ne peux d´eplacer qu"un plateau `a la fois -Les plateaux doivent toujours rang´es par taille d´ecroissante sur une tige.

1.R´esolvez le probl`eme `a la main sin= 2,i= 0 etj= 2.Correction :

5 -On transf`ere le petit plateau de 0 `a 1. -On transf`ere le grand plateau de 0 `a 2. -On transf`ere le petit plateau de 1 `a 2. Si vous n"ˆetes pas convaincus, faites un dessin ...?

2.R´esolvez le probl`eme `a la main sin= 3,i= 0 etj= 2.Correction :

-On transf`ere le petit plateau de 0 `a 2. -On transf`ere le plateau moyen de 0 `a 1. -On transf`ere le petit plateau de 2 `a 1.

(ce faisant, on a d´eplac´e 2 plateaux de 0 vers 1).-On tranf`ere le grand plateau de 0 vers 2.

-On transf`ere le petit plateau de 1 `a 0. -On transf`ere le plateau moyen de 1 `a 2.quotesdbs_dbs4.pdfusesText_8