.. _interrorapide20minutes201412rst: =============================================================== 1A.e - Correction de l’interrogation écrite du 14 novembre 2014 =============================================================== .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/exams/interro_rapide_20_minutes_2014_12.ipynb|*` dictionnaires .. code:: ipython3 from jyquickhelper import add_notebook_menu add_notebook_menu() .. contents:: :local: Enoncé 1 ~~~~~~~~ Q1 ^^ Le code suivant produit une erreur. Laquelle ? .. code:: ipython3 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. .. code:: ipython3 def make_squares(n): squares = [i**2 for i in range(n)] print ( make_squares(2) ) .. parsed-literal:: None Q2 ^^ Que vaut ``a`` ? .. code:: ipython3 s = 1 a = 0 for i in range(4): a += s s += 2 .. code:: ipython3 a .. parsed-literal:: 16 Si on affiche les résultats intermédiaires : .. code:: ipython3 s = 1 a = 0 for i in range(4): print(a,s) a += s s += 2 a .. parsed-literal:: 0 1 1 3 4 5 9 7 .. parsed-literal:: 16 Q3 ^^ On rappelle que ``ord('a')=97``. Que vaut ``x`` ? .. code:: ipython3 d = {i:chr(i+97) for i in range(10)} x = d[4] .. code:: ipython3 x .. parsed-literal:: '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 ? .. code:: ipython3 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)) .. parsed-literal:: (['Alice', 'Claire', 'Bob'], 18) .. code:: ipython3 notes .. parsed-literal:: {'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 : .. code:: ipython3 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)) .. parsed-literal:: (['Claire', 'Bob'], 18) Q5 ^^ Que renvoie la fonction suivante en fonction de ``n`` ? .. code:: ipython3 def f(n): while n != 1: if n%2 == 0: n = n/2 else: n = 3*n + 1 return n .. code:: ipython3 f(3) .. parsed-literal:: 1.0 .. code:: ipython3 f(4) .. parsed-literal:: 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 :math:`n`. Cette question était un peu hors sujet. Il faudrait étudier la convergence de la suite :math:`u_{n+1}=f(u_n)` où :math:`f` est la fonction : :math:`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 `__.