Étape 1
Pour déterminer la valeur de l'entier $k$, analysons le déroulement de l'appel traiter_liste([10, k, 5]) en évaluant chaque sous-fonction.
Étape 2
Calculons la valeur renvoyée par la fonction transformer pour le premier élément $x = 10$ :
Étape 3
Comme $10 \% 2 = 0$, l'appel est_impair(10) renvoie False. On effectue donc la division entière de $10$ par $2$ :
Étape 4
$$\text{transformer}(10) = 10 // 2 = 5$$
Étape 5
Calculons la valeur renvoyée par la fonction transformer pour le troisième élément $x = 5$ :
Étape 6
Comme $5 \% 2 = 1 \neq 0$, l'appel est_impair(5) renvoie True. On applique la formule $3n + 1$ :
Étape 7
$$\text{transformer}(5) = 3 \times 5 + 1 = 16$$
Étape 8
La fonction traiter_liste calcule la somme des transformations de chaque élément de la liste. On a donc :
Étape 9
$$\text{traiter\_liste}([10, k, 5]) = \text{transformer}(10) + \text{transformer}(k) + \text{transformer}(5)$$
Étape 10
En remplaçant par les valeurs calculées et la valeur totale renvoyée ($35$), nous obtenons l'équation :
Étape 11
$$5 + \text{transformer}(k) + 16 = 35$$
Étape 12
$$21 + \text{transformer}(k) = 35$$
Étape 13
$$\text{transformer}(k) = 35 - 21 = 14$$
Étape 14
Déterminons maintenant la valeur de l'entier $k$ telle que $\text{transformer}(k) = 14$ en étudiant la parité de $k$ :
Étape 15
Si $k$ est impair, alors $\text{transformer}(k) = 3k + 1$. L'équation $3k + 1 = 14$ donne $3k = 13$, soit $k = \frac{13}{3}$, ce qui n'est pas un entier.
Étape 16
Si $k$ est pair, alors $\text{transformer}(k) = k // 2$. L'équation $k // 2 = 14$ donne $k = 14 \times 2 = 28$. Le nombre $28$ est bien un entier pair.
Étape 17
La seule valeur entière possible est donc $k = 28$.
Méthode clé
Dans un algorithme modulaire, il faut exécuter pas à pas les sous-fonctions appelées pour chaque élément connu avant d'isoler la valeur de l'élément inconnu.
Piège à éviter
Oublier de tester les deux cas de parité pour l'entier inconnu $k$ lors de l'inversion de la fonction transformer.