1A.e - Correction de l’interrogation écrite du 14 novembre 2014

dictionnaires

Enoncé 1

Q1

Le code suivant produit une erreur. Laquelle ?

[2]:
def make_squares(n):
    squares = [i**2 for i in range(n)]

Comme il n’y a pas d’instruction return, la fonction retourne toujours None quelque chose le résultat de ce qu’elle calcule.

[3]:
def make_squares(n):
    squares = [i**2 for i in range(n)]


print(make_squares(2))
None

Q2

Que vaut a ?

[4]:
s = 1
a = 0
for i in range(4):
    a += s
    s += 2
[5]:
a
[5]:
16

Si on affiche les résultats intermédiaires :

[6]:
s = 1
a = 0
for i in range(4):
    print(a, s)
    a += s
    s += 2

a
0 1
1 3
4 5
9 7
[6]:
16

Q3

On rappelle que ord('a')=97. Que vaut x ?

[7]:
d = {i: chr(i + 97) for i in range(10)}
x = d[4]
[8]:
x
[8]:
'e'

Il suffit de remplacer i par 4. x vaut chr(97+4) et on se déplace de 4 lettres dans l’alphabet, soit e.

Q4

Que fait le programme suivant ?

[9]:
notes = {"Alice": 17, "Bob": 18, "Jean−Ma": 17}
notes["Claire"] = 18


def mystere(d):
    a = 0
    b = []
    for k, v in d.items():
        if v >= a:
            a = v
            b.append(k)
    return (b, a)


print(mystere(notes))
(['Alice', 'Claire', 'Bob'], 18)
[10]:
notes
[10]:
{'Alice': 17, 'Claire': 18, 'Bob': 18, 'Jean−Ma': 17}

Le programme commence par ajouter la clé Claire au dictionnaire. La variable a mémorise la valeur numérique la plus grande. En l’état, le résultat programme est assez imprévisible puisqu’il dépend de l’ordre dans lequel on parcourt les éléments. Je pense que la fonction devrait récupérer dans une liste l’ensemble des prénoms correspondant à cette valeur maximale s’il était écrit comme ceci :

[11]:
notes = {"Alice": 17, "Bob": 18, "Jean−Ma": 17}
notes["Claire"] = 18


def mystere(d):
    a = 0
    b = []
    for k, v in d.items():
        if v == a:
            b.append(k)
        elif v > a:
            a = v
            b = [k]
    return (b, a)


print(mystere(notes))
(['Claire', 'Bob'], 18)

Q5

Que renvoie la fonction suivante en fonction de n ?

[12]:
def f(n):
    while n != 1:
        if n % 2 == 0:
            n = n / 2
        else:
            n = 3 * n + 1
    return n
[13]:
f(3)
[13]:
1.0
[14]:
f(4)
[14]:
1.0

D’après la condition indiquée dans la boucle while, la fonction retourne 1. Reste à savoir si cela est toujours possible quelque soit n. Cette question était un peu hors sujet. Il faudrait étudier la convergence de la suite u_{n+1}=f(u_n)f est la fonction :

f(n) = \left\{ \begin{array}{ll} \frac{n}{2} & si \; n \; pair \\ 3n+1 &sinon \end{array}\right.

Ce problème n’est pas évident puisqu’il ressemble beaucoup à la conjecture de Syracuse.

[15]:


Notebook on github