Algorithmes et Programmation 2, année 2023

Programmation fonctionnelle.

Exercice 1: Les fonctions enumerate et zip

La fonction enumerate prend en entrée une liste et retourne un itérateur des paires (indices, valeurs) de la liste.

L = ["choucroute", "garnie", "au sel"]
print(list(enumerate(L)))
[(0, 'choucroute'), (1, 'garnie'), (2, 'au sel')]
  1. Proposez une fonction impérative mon_enumerate qui réalise (presque) la même chose: au lieu de retourner un itérateur elle retournera une liste.

La fonction zip prend en entrée deux listes et retourne un itérateur des paires jusqu’à avoir consommé la plus courte des listes.

print(list(zip(["a", "b", "c"], range(2))))
[('a', 0), ('b', 1)]
  1. Proposez une fonction impérative mon_zip qui réalise (presque) la même chose: au lieu de retourner un itérateur elle retournera une liste.

  2. Proposez une implémentation de mon_enumerate en une ligne, uniquement avec zip et la fonction count du module itertools.

Exercice 2: Distance euclidienne de vecteurs

On modélise les vecteurs de \(\mathbb{R}^n\) par des listes de \(n\)-float.

On rappelle que pour \(v_1,v_2\in \mathbb{R}^n\), on a la distance euclidienne de \(v_1\) a \(v_2\) qui est définit par

\[d_2(v_1,v_2) = \sqrt(\sum_{i=0}^{n-1} (v_1[i] - v_2[i])^2)\]

  1. Écrire une fonction impérative qui prends deux vecteurs et retourne leur distance
  2. Écrire une version fonctionnelle en une ligne

Exercice 3: argmax

La fonction argmax prends en entrée une liste d’entiers et retourne l’indice du plus grand élément de la liste.

  1. Proposez une implémentation impérative de argmax
  2. Proposez une implémentation recursive de argmax
  3. Écrire une version fonctionnelle en une seule ligne

Exercice 4: any, all

La fonction any prends en argument une liste et retourne True si l’un des élements de la liste est évalué à True par la fonction bool.

L = [0, [], (), {}, ""]
print(any(L))
False

Par contre

L = [0, [], (), {}, "", "a"]
print(any(L))
True
  1. Proposez une implémentation impérative de any
  2. Proposez une implémentation récursive de any
  3. Proposez une implémentation fonctionnelle en une ligne de any

La fonction all retourne True si tous les arguments sont évalués à True.

  1. Implémenter all de manière fonctionnelle en une ligne à l’aide de bool, any et des map bien choisis.

Vous pouvez utiliser le fait que logiquement: \(\forall xx \textrm{bool}(x)\) est équivalent à \(\lnot \exists x. \lnot \textrm{bool}(x)\) avec \(\lnot\) la négation logique.

Exercice 5: Counter

La fonction Counter du module collections prends en argument un itérable et retourne un dictionnaires de l’occurrence de chaque élément dans l’itérable.

import collections
L = [0, 1, 2, 0, 1, 0]
print(collections.Counter(L))
Counter({0: 3, 1: 2, 2: 1})
  1. Écrire une implémentation impérative de Counter
  2. Écrire une version récursive de Counter
  3. En utilisant la fonction reduce, écrire une implémentation fonctionnelle de Counter

Pour cette fonction, il est fortement déconseillé d’utiliser une fonction lambda.

Exercice 6: Nombre premiers

  1. Écrire une fonction impérative qui retourne les nombres premiers plus petit que \(n\).

  2. Écrire une version récursive.

  3. Écrire une version fonctionnelle en une ligne. (difficile)


Compiled the: mer. 15 mai 2024 22:33:13 CEST