TP n°5 ( )1

Transcription

TP n°5 ( )1
IUT La Rochelle - Dépt R&T
Info 1ème année – Module I3
Récursivité, Listes
2011-2012
Laurent Demay
C. Sempé, J. Khamlichi
C.
T.P. n°5
1. Calcul récursif du pgcd
a) Réécrivez l’algorithme des différences successives (TP n°3) sous une forme adaptée à la récursivité :
  si a  b

le pgcd de a et de b est égal à  pgcd( , ) si a  b

 pgcd( , ) si a  b
b) Déduisez-en une version récursive de la fonction pgcd(a,b). Testez.
2. Valeur d’un polynôme en un point
On souhaite écrire une fonction val_poly(coeffs, x) qui calcule et retourne la valeur en un point x d’un polynôme
P( x) de coefficients a0 , a1 , , an stockés dans la liste coeffs.
Exemple d’utilisation :
définit le polynôme P( x)  7  3 x  x 2  5 x3
retourne P (2)  7  3  2  4  5  8  45
On remarque que le calcul de P ( x) peut s'effectuer ainsi : P ( x)  a0 
(algorithme de Horner )

a  a x   a x   x



n 1
1
2
n
valeur en x du polynome de
degré n  1 et de coeffs a1 , ,an
Ecrivez et testez la fonction récursive val_poly(coeffs, x) en exploitant la décomposition précédente de P ( x)
Indications : coeffs[1:] représente la sous-liste des coefficients a1 , , an
si : coeffs est la liste vide [] alors, P( x) vaut 0 (polynôme nul)
3. Tri récursif d’une liste de nombres
On souhaite écrire une version récursive de la fonction trier(liste) du TD n°3 qui trie par ordre croissant une liste
de nombres suivant la méthode dite du « tri par extraction » suivante :
Exemple :
- on extrait (enlève) de le plus grand élément de la liste
que l’on mémorise dans une variable auxiliaire maxi
[3, -1, 2, 5, 4, 0]
[3, -1, 2, 4, 0]
maxi = 5
- on trie par ordre croissant la (sous-)liste restante
[-1, 0, 2, 3, 4]
maxi = 5
- on rajoute en fin de liste le maximum extrait précédemment
[-1, 0, 2, 3, 4, 5]
a) Ecrivez et testez la fonction récursive trier(liste) en utilisant la méthode précédente.
Indications :
- fonctions et méthodes python supplémentaires utiles sur les listes
max(liste)
retourne le maximum d’une liste de nombres liste
liste.remove(val)
supprime la 1ère valeur val rencontrée de la liste
liste.append(val)
rajoute la valeur val en fin de la liste
- une liste de 0 ou 1 élément est forcément déjà triée (rien à faire) …
b) Pourquoi la fonction trier(liste) n’a-t-elle pas besoin de retourner un résultat ?
Comment l’utilise-t-on ?
Ou se trouvent la liste originale et la liste triée à la fin de l’exécution de la fonction ?
4. Le flocon de neige de Koch (facultatif : pour occuper les plus rapides)
Nous allons utiliser le module graphique turtle pour dessiner une figure célèbre appelée flocon de neige de Koch.
Ce module permet de gérer un curseur ( « tortue » ) qui peut dessiner des traits en se déplaçant dans une fenêtre graphique.

Les programmes utilisant le module turtle doivent être exécutés
sous Python Scrypter avec le « moteur Python » distant Tk
(menu « Executer / Moteur Python » )
Voici les principales commandes du module turtle :
reset() initialisation de la tortue (nécessaire au moins une fois, tout au début)
down(), up() abaisser ou relever le crayon (pour avancer en traçant ou non)
goto(x, y) aller au point de coordonnées x, y
forward(d), backward(d) avancer ou reculer d’une distance d
left(angle), right(angle) tourner à gauche ou à droite d’un angle donné en degrés
a) Testez le programme suivant :
Faites des modifications pour dessiner
la figure de votre choix.
Essayez de bien voir où se situe l’origine.
Le flocon de neige de Koch est un dessin fractal , c’est-à-dire qu’on y voit le même motif quelle que soit l’échelle à laquelle
on l’examine. Beaucoup de structures biologiques naturelles semblent avoir cette propriété.
Examinons les motifs suivants :
(a)
(b)
(c)
On divise un segment en trois parties égales, on construit un triangle équilatéral sur le segment du milieu et on efface la base
pour obtenir le motif (a). On recommence en appliquant la même procédure sur chaque segment du motif (a) et on obtient le
motif (b) ; en recommençant encore, on a le motif (c) et ainsi de suite.
Nous allons définir une procédure def motif(n) qui dessine le motif ayant comme base un segment de longueur n.
Cela consiste à :
dessiner un motif de longueur n /3 (c.-à-d. appel de motif(n/3))
tourner à gauche puis dessiner un motif de longueur n /3 (appel de motif(n/3))
tourner ensuite à droite puis dessiner un motif de longueur n /3 (appel de motif(n/3))
tourner enfin à gauche puis dessiner un motif de longueur n /3 (appel de motif(n/3))
Il s’agit donc d’une procédure récursive. Il y a cependant un problème : cela ne s’arrête jamais !
Il faut donc mettre fin à ce processus par une condition d’arrêt : lorsque que n est inférieur à une constante L fixée , on ne
fait pas d’appels récursifs à la procédure motif mais on se limite à dessiner un segment d’une longueur n.
b) Ecrivez la procédure récursive def motif(n) et faites quelques essais pour n = 200, 300, 400 …
On utilisera une variable globale L initialisée par exemple à 10 ou à 20 avant la procédure pour la constante L
Pour dessiner maintenant le flocon, on va dessiner trois motifs
consécutifs en s’appuyant sur les bases d’un triangle équilatéral :
c)
Ecrivez la procédure def flocon(n) qui dessine
un flocon de Koch de largeur n. Testez.
(essayer de centrer la figure dans la fenêtre)
début 

Documents pareils