comment retrouver la forme récursive

18
Comment trouver la forme récursive? Mariem ZAOUALI Assistante contractuelle à l’Institut National des Sciences Appliquées et de Technologie – INSAT - TUNIS NB : Téléchargez la présentation pour voir l’animation

Upload: mariem-zaouali

Post on 13-Apr-2017

282 views

Category:

Engineering


0 download

TRANSCRIPT

Page 1: Comment retrouver la forme récursive

Comment trouver la forme récursive?

Mariem ZAOUALIAssistante contractuelle à l’Institut National

des Sciences Appliquées et de Technologie – INSAT - TUNIS

NB : Téléchargez la présentation pour voir l’animation

Page 2: Comment retrouver la forme récursive

Exemple Ecrire une fonction récursive en C qui

permet de convertir un entier en binaire

L’astuce est la suivante : Soit 42 est l’entier à convertir, sa conversion binaire est 101010

Page 3: Comment retrouver la forme récursive

Exemple Soit:

42 2

210 2

1 10

0

2

5

1

22 2

2101 0

Le résultat de 42 est 101010 (lecture inverse des restes)

1 – La première étape pour établir une forme récursive est de chercher une condition d’arrêt : Quand dois-je m’arrêter? Sinon l’appel récursif sera infini ou finira avec une erreur!

Page 4: Comment retrouver la forme récursive

Etape 1 Dans ce cas, la condition d’arrêt est

lorsque je trouve un « 0 » comme quotient

42 2

210 2

1 10

0

2

5

1

22 2

2101 0

Page 5: Comment retrouver la forme récursive

Etape 1 Ainsi la première forme de notre

fonction récursive est la suivante int Binaire (int nbre_a_convertir){ if(nbre_a_convertir / 2 == 0) return nbre_a_convertir % 2; } La question qui se pose maintenant

est : comment atteindre cette condition d’arrêt?

Page 6: Comment retrouver la forme récursive

Etape 2 Il faut trouver un lien entre le nombre à

entrer au départ et la condition d’arrêt.

Page 7: Comment retrouver la forme récursive

Etape 2 Dresser l’arbre de dépendance entre

les appels récursifsBinaire(42)

Binaire(21)

Binaire(10)

Binaire(5)

Binaire(2)

Binaire(1)

Page 8: Comment retrouver la forme récursive

Etape 2 Dresser l’arbre de dépendance entre

les appels récursifsBinaire(42)

Binaire(21)

Binaire(10)

Binaire(5)

Binaire(2)

Binaire(1) Retourne 1 : le reste

Fait appel à Binaire(1)

Fait appel à Binaire(2)

Fait appel à Binaire(5)

Fait appel à Binaire(10)

Fait appel à Binaire(21)

Pour passer de 42 à 21 il faut prendre le quotient de 42/2

La même chose pour les autres : pour passer d’un appel à un autre il faut passer le quotient du nombre courant

Page 9: Comment retrouver la forme récursive

Etape 2 Ca veut dire

Binaire(42)

Binaire(21)

Binaire(10)

Binaire(5)

Binaire(2)

Binaire(1) Retourne 1 : le reste

Fait appel à Binaire(2 DIV 2)

Fait appel à Binaire(5 DIV 2)

Fait appel à Binaire(10 DIV 2)

Fait appel à Binaire(21 DIV 2)

Fait appel à Binaire(42 DIV 2)

Page 10: Comment retrouver la forme récursive

Etape 2 Ainsi la nouvelle forme de la méthode

récursive estint Binaire (int nbre_a_convertir){ if(nbre_a_convertir / 2 == 0) return nbre_a_convertir % 2;

elsereturn Binaire(nbre_a_convertir/2);

}

Page 11: Comment retrouver la forme récursive

Etape 3 Testez votre méthode : le résultat de

42 sera 1 .. Où sont passés les autres chiffres?

Tel qu’on a écrit la méthode, nous ne sommes pas entrain de sauvegarder les résultats des états intermédiaires avant d’atteindre la condition d’arrêt

Page 12: Comment retrouver la forme récursive

Etape 3 Pour ne pas les perdre, on suggère de

multiplier par 10 l’appel récursif

Pourquoi?› On remarque que le premier nombre à être

retourné est celui de la condition d’arrêt et c’est bien le premier nombre à gauche du résultat soit 101010

› Voyons comment le résultat se forme

Page 13: Comment retrouver la forme récursive

Etape 3 Dresser l’arbre de dépendance entre

les appels récursifsBinaire(42)

Binaire(21)

Binaire(10)

Binaire(5)

Binaire(2)

Binaire(1) Retourne 1 : le reste

Fait appel à Binaire(1)*10 et retourne 1*10=10

Fait appel à Binaire(2)*10 et retourne 10*10=100

Fait appel à Binaire(5)*10 et retourne 100*10=1000

Fait appel à Binaire(10)*10 et retourne 1000*10=10000

Fait appel à Binaire(21)*10 et retourne 10000*10=10000

Page 14: Comment retrouver la forme récursive

Etape 3 Chouette ! On a pu décaler le 1 à

gauche mais le résultat est à côté de la plaque …

Que faire?› Ici il faut remarquer une nouvelle

caractéristique (pour la découvrir il faut tester sur votre brouillon la conversion de plusieurs nombres pour pouvoir la détecter)

Page 15: Comment retrouver la forme récursive

Etape 3 Remarquez le lien entre 4DIV2=2 et 4

› 10 et 100 (10*10=100) Remarquez le lien entre 8DIV2=4 et 8

› 100 et 1000 (100*10=1000) Remarquez le lien entre 16DIV2=8 et 16

› 1000 et 10000 (1000*10=10000)

› On peut dire que si j’ai le nombre binaire d’un nombre entier pair alors il suffit de le multiplier par 10 pour trouver le nombre binaire de son double

Page 16: Comment retrouver la forme récursive

Etape 3 Remarquez le lien entre 5DIV2=2 et 5

› 10 et 101 (10*10 +1 =101) Remarquez le lien entre 7DIV2=3 et 7

› 11 et 111 (11*10+1=111) Remarquez le lien entre 9DIV2=4 et 9

› 100 et 1001 (100*10+1=1001)

› On peut dire que si j’ai le nombre binaire d’un nombre entier impair, il faut prendre le nombre binaire du quotient de sa division par 2 le multiplier par 10 et le rajouter 1

Page 17: Comment retrouver la forme récursive

Ainsi La forme finale de notre méthode est :int Binaire (int nbre_a_convertir){ if(nbre_a_convertir / 2 == 0) return nbre_a_convertir % 2; else if (n % 2 == 0) // n est pair

return Binaire(nbre_a_convertir/2)*10; else return Binaire(nbre_a_convertir/2)*10+1; }

elsereturn Binaire(nbre_a_convertir/2);

}

Page 18: Comment retrouver la forme récursive

Fin =) Übung macht den Meister !

› En s’exerçant on devient « maître »› Pour comprendre la récursivité, défiez-vous

avec plusieurs exercices › Bon courage!