Exercice 1

Transcription

Exercice 1
2017
Informatique commune. Devoir en temps limité 1
PC*
Mardi 18 octobre 2016 - durée 2h
Votre nom
Exercice 1
On considère la fonction suivante :
def f(x):
a = 5
for k in range(x):
a = a + 3
return a
1 De quel type doit être l’argument x de la fonction ? Pourquoi ?
2 Préciser l’invariant de boucle en entrée du tour de boucle k.
3 Que renvoie f (x) ?
2016-2017
1/8
2017
PC*
Informatique commune. Devoir en temps limité 1
Mardi 18 octobre 2016 - durée 2h
4 Définir une fonction récursive g(x) qui renvoie la même valeur que f(x).
Exercice 2
On considère une liste de flottants, correspondant à de nombreuses mesures effectuées au cours
d’une expérience. On souhaite déterminer si l’une de ces mesures est nulle.
1 Définir une fonction itérative cherche_zero_1(a) qui renvoie un booléen indiquant la
présence d’une mesure nulle dans la liste de flottants a.
2/8
2016-2017
2017
PC*
Informatique commune. Devoir en temps limité 1
Mardi 18 octobre 2016 - durée 2h
2 Discuter de l’efficacité de la fonction proposée.
3 Reprendre la première question avec une fonction récursive cherche_zero_2(a).
2016-2017
3/8
2017
Informatique commune. Devoir en temps limité 1
PC*
Mardi 18 octobre 2016 - durée 2h
Problème
Le but du problème est d’engendrer l’ensemble P(E) des parties d’un ensemble fini E donné.
Les éléments d’un ensemble E de cardinal n sont stockés dans une liste Python E de longueur n,
dont on supposera sans vérification les éléments deux à deux distincts.
Pour caractériser un sous-ensemble A de E, on utilise un tableau de présence stocké dans
une liste Python p de longueur n, dont les éléments valent 0 ou 1, et qui sont définis de la façon
suivante :
∀i ∈ {0, . . . , n − 1}, E[k] est élément de A ⇐⇒ p[k] = 1
Par exemple, avec n = 4, si E = [3,5,7,9], alors E = {3, 5, 7, 9} et :
• p=[0,1,0,0] correspond à la partie {5}
• p=[1,0,1,0] correspond à la partie {3, 7}
Lorsque ce n’est pas précisé, les fonctions proposées pourront être itératives ou récursives.
Lorsqu’une fonction récursive est demandée, elle pourra être elle-même récursive ou faire appel
à une fonction auxiliaire récursive.
1 Définir une fonction itérative partie_1(E,p), prenant en arguments un ensemble et un
tableau de présence de mêmes longueur, et qui renvoie sous forme de liste la partie de
l’ensemble E définie par le tableau de présence p.
Ainsi, partie_1([3,5,7,9],[1,0,1,0]) renvoie [3,7].
4/8
2016-2017
2017
PC*
Informatique commune. Devoir en temps limité 1
Mardi 18 octobre 2016 - durée 2h
2 Définir de même une fonction récursive partie_2(E,p).
On souhaite engendrer P(E), et donc créer tous les tableaux de présence possibles.
On utilise dans un premier temps la propriété suivante, que l’on ne demande pas de démontrer :
lorsqu’un entier j varie de 0 à 2n −1, les listes de chiffres de son écriture en base 2, éventuellement
complétée de 0, fournissent tous les tableaux de présence de longueur n. Par exemple, pour
n = 3, les entiers de 0 à 7 s’écrivent respectivement en base 2 : 000, 001, 010, 011, 100, 101,
110, 111 et correspondent aux tableaux de présence respectifs [0,0,0], [0,0,1], [0,1,0],
[0,1,1], [1,0,0], [1,0,1], [1,1,0], [1,1,1].
3 Soit p un tableau de présence de longueur n correspondant à un entier j ∈ J0, 2n − 1K.
On souhaite obtenir le tableau de présence de j + 1.
(a) Le tableau de présence de j + 1 peut-il toujours être de longueur n ?
2016-2017
5/8
2017
PC*
Informatique commune. Devoir en temps limité 1
Mardi 18 octobre 2016 - durée 2h
(b) Lorsque c’est possible, décrire une méthode permettant de passer du tableau de
présence correspondant à j à celui correspondant à j + 1.
4 Définir une fonction ajoute_un(p) qui prend en argument un tableau de présence p
correspondant à un entier j, et qui modifie ce tableau pour qu’il corresponde à l’entier j+1.
On ne se préoccupera pas d’éventuel(s) cas particulier(s) évoqué(s) à la question 3a .
6/8
2016-2017
2017
PC*
Informatique commune. Devoir en temps limité 1
Mardi 18 octobre 2016 - durée 2h
5 Définir une fonction itérative ensemble_parties_1(E) qui utilise les fonctions précédentes, et qui renvoie la liste de toutes les parties de l’ensemble E.
On souhaite toujours engendrer P(E), mais par une autre approche. On engendre la liste de
tous les tableaux de présence à l’aide de la fonction suivante :
def genere_tableaux_presence(n):
"""Renvoie la liste des tableaux de présence pour n éléments"""
if n == 0:
return ...
else:
A = genere_tableaux_presence (n-1)
return [a+[0] for a in A] + [a+[1] for a in A]
6
(a) Quel est le type des valeurs renvoyées par la fonction genere_tableaux_presence ?
(b) Dans le code proposé, il manque le cas terminal. Le compléter.
2016-2017
7/8
2017
PC*
Informatique commune. Devoir en temps limité 1
Mardi 18 octobre 2016 - durée 2h
(c) On mesure la complexité en temps en dénombrant les utilisations de append (ou
leurs utilisations cachées dans la concaténation des listes). On note T (n) ce nombre
lors de l’évaluation de genere_tableaux_presence(n).
Donner la relation de récurrence satisfaite par T (n). En déduire la valeur de T (n).
Est-ce raisonnable ?
7 Définir une fonction ensemble_parties_2(E) qui utilise la fonction précédente, et qui
renvoie la liste de toutes les parties de l’ensemble E.
8/8
2016-2017