Commencer par créer un répertoire python_1617 dans votre dossier

publicité
2017
Travaux dirigés python 1
PC*
Mardi 20 septembre
Commencer par créer un répertoire python_1617 dans votre dossier personnel, puis créer un
sous-répertoire «TDx» où x représente le numéro du TD, sous-répertoire dans lequel vous
pourrez sauvegarder vos fichiers Python relatifs à ce TDx.
Sortir un stylo, du brouillon et de quoi prendre des notes (à conserver !) sur ce que vous
apprenez au fur et à mesure.
Exo 1
On construit une liste d’entiers choisis aléatoirement dans J0, 20J :
import random
a = []
for i in range(100):
a.append(random.randrange(20))
On souhaite effectuer un tri des éléments de a, en sachant qu’il s’agit d’entiers positifs.
(1) Déterminer la valeur maximale k des éléments de a. Construire la liste b de longueur k+1, dans
laquelle chaque case bi contient le nombre d’occurences de i dans a.
(2) Déduire de b une liste c contenant les éléments de a, triée par ordre croissant.
(3) Évaluer la complexité en temps et en espace de cette méthode de tri.
Exo 2
On définit la suite (fn )n∈N par :
(
f0 = f1 = 1
∀n ∈ N, fn+2 = fn+1 + fn .
(1) Écrire une fonction récursive fibo(n) qui calcule fn .
(2) Chronométrer le temps d’exécution de cette fonction pour le calcul de f35 .
(3) On note T (n) le nombre d’additions effectuées lors de l’évaluation de fibo(n). Donner la relation
de récurrence satisfaite par T (n), puis l’expression de T (n) en fonction de n.
(4) Reprendre les questions précédentes avec une fonction itérative, et conclure.
(5) Peut-on proposer une fonction récursive qui permette de calculer fn en temps linéaire ?
Exo 3
Considérons l’entier N = 42.
0n a N = 32 + 8 + 2 = 1 × 25 + 0 × 24 + 1 × 23 + 0 × 22 + 1 × 21 + 0 × 20 . L’écriture en base 2 de
l’entier N est donc :
101010
On a N = 40 + 2 = 4 × 101 + 2 × 100 . L’écriture en base 10 de N est donc :
42
(1) Écrire une fonction base2(n), qui prend en argument un entier n, et qui renvoie son écriture en
base 2. Expliquer les choix faits concernant les structures de données utilisées. Tester sa fonction
avec N .
(2) Écrire sur le modèle de la fonction précédente une fonction base, qui prend en argument un
entier n et un second argument, optionnel, correspondant à la base b dans laquelle on souhaite
obtenir l’écriture de n. Par défaut, il s’agira de l’écriture binaire. Tester sa fonction avec N .
(3) Écrire une fonction réciproque à la fonction précédente. Discuter de l’efficacité de cette dernière
fonction. Tester sa fonction avec N .
2016-2017
1/4
2017
PC*
Travaux dirigés python 1
Mardi 20 septembre
Exo 4
(1) Définir une fonction cherche_mot(w,s) qui teste la présence du mot w dans la chaîne s.
(2) Évaluer la complexité temporelle de la fonction précédente en dénombrant les comparaisons de
caractères.
Exo 5
(1) Définir une fonction récursive retourne(s), dont l’argument est une chaîne de caractères, et qui
renvoie la chaîne écrite à l’envers.
Ainsi, retourne("python") renvoie la chaîne "nohtyp".
(2) Définir une fonction est_palindrome(s) récursive, ou faisant appel à une fonction récursive,
dont l’argument est une chaîne de caractères, et qui renvoie le booléen indiquant si s est un
palindrome ou non.
On rappelle qu’un palindrome est un mot qui peut se lire aussi bien de la gauche vers la droite
que de la droite vers la gauche, comme « kayak » ou « radar ».
(3) Discuter de l’efficacité de la fonction proposée.
2/4
2016-2017
2017
PC*
Travaux dirigés python 1
Mardi 20 septembre
Rappels de syntaxe / Indications
Exercice 1
•Python est un langage modulaire : de nombreuses fonctions supplémentaires sont définies dans des
modules que l’on doit importer en début de session intéractive pour y avoir accès (commande import
random par exemple).
Par exemple, le module math contient un grand nombre de fonctions (pour les lister, après import
math, écrire la commande dir(math)) : pour avoir de l’aide sur le module math, taper help(math) et
pour avoir de l’aide sur la fonction sqrt du module math, taper help(math.sqrt).
Pour accéder à la fonction sqrt de math, taper math.sqrt
Dans l’exercice 1, on a importé tout le module random, et on a appelé la fonction random de ce module
à l’aide de random.random
On aurait pu aussi importer tout le module random via «from random import ∗», puis accéder à la fonction random via «random», mais méthode à
éviter (conflit potentiel de noms entre plusieurs modules).
•range(30) désigne l’ensemble d’entiers J0, 29K ou encore J0, 30J.
•Noter également : l’initialisation à la liste vide, la syntaxe de la boucle for (avec le :) et l’indentation !
•python dispose d’une fonction max
•Ne pas oublier l’initialisation de b.
•Pour créer la liste [0,0,0], on peut soit [0] * 3
soit [0 for i in range(3)]
•Avec une liste L, on peut parcourir les indices de cette liste (via «for k in range(len(L))») ou parcourir les éléments de cette liste (via «for elt in L»).
•Affectations augmentées de variables : s+=1 désigne s=s+1, p*=2 désigne p=p*2 (fonctionne
aussi avec /=, //=, %=,**=, )
Exercice 2
•Pour calculer le temps d’exécution d’une instruction, on peut procéder ainsi :
on import le module time
puis, avant le début de l’instruction (resp. à la suite de l’instruction), on met «debut = time.clock()»
(resp «fin = time.clock()»)
puis on affiche le résultat via «print(fin - debut)»
•Pour une fonction récursive linéaire, on pourra définir une fonction aux
Exercice 3
1. Si L est une liste, L.append(a) permet d’ajouter en dernière position l’élément a à la liste L.
L.reverse() permet de «renverser» la liste L.
n%2 (resp. n//2) renvoie le reste (resp. le quotient) de la division euclidienne de n par 2.
3 Si L = [ak , . . . , a0 ] est la liste correspondant à l’écriture en base 2 de n, alors n =
k
X
ai 2i .
i=0
2016-2017
3/4
2017
PC*
Travaux dirigés python 1
Mardi 20 septembre
Exercice 5
Dans un premier temps, vous pourrez écrire une fonction est_palindrome en O(n2 ), puis l’améliorer
en une fonction linéaire.
4/4
2016-2017
Téléchargement