Chapitre 12

Chapitre 12

12.1 Bases de la récursivité

1.
a. Le déplacement du plus petit anneau, qui est un problème plus petit, est effectué deux fois lors de la résolution globale pour les deux anneaux. La tâche consistant à déplacer l'ensemble des trois anneaux est décomposée en tâches plus petites consistant à déplacer un anneau à la fois.
2.
b. La solution à deux anneaux de la question 1 est utilisée dans la solution pour trois anneaux.
3.
b. Une fois pour déplacer deux anneaux vers la tour du milieu selon les règles, puis pour déplacer deux anneaux vers la tour cible.
4.
c. Le petit anneau est déplacé vers la tour du milieu. Le plus grand anneau est déplacé vers la tour cible. Ensuite, le petit anneau est déplacé du milieu vers la cible.
5.
c. Pour résoudre le problème, la solution à deux anneaux est utilisée deux fois, et il y a une étape supplémentaire pour déplacer le plus grand anneau de la tour source vers la cible. Chaque solution à deux anneaux nécessite trois étapes. Le total est donc de 3 + 1 + 3 = 7 étapes.
6.
a. Le problème à quatre anneaux utilise deux fois la solution à trois anneaux. Les trois anneaux plus petits sont déplacés vers la tour du milieu, ce qui nécessite sept étapes comme dans la question 2. Une étape est nécessaire pour déplacer le plus grand anneau de la source vers la cible. Il faut sept étapes supplémentaires pour déplacer les trois anneaux plus petits du milieu vers la cible. Le total est de 7 + 1 + 7 = 15 étapes.

12.2 Récursivité mathématique simple

1.
La somme peut être calculée à l'aide de la récursivité car il existe un motif régulier et la somme jusqu'à n dépend de la somme jusqu'à n - 1.
2.
Chaque nombre de la suite peut être obtenu en ajoutant 2 au nombre précédent, la solution en 1 étant 1 .
3.
Un nombre premier ne dépend pas d'un nombre premier plus petit ; ainsi, aucune récursivité ne permet de générer de nouveaux nombres premiers à partir d'une liste existante de nombres premiers.
4.
Un nombre donné dans la suite de Fibonacci s'obtient en additionnant les deux nombres précédents de la suite, la suite de Fibonacci peut donc être obtenue de manière récursive.
5.
c. Il manque un cas de base, la récursivité n'a donc aucun moyen de se terminer.
6.
b. Cette définition de rec_fact() utilise un cas de base de n == 0, ce qui fonctionne car, tout comme 1!, 0! = 1. Cependant, le cas de base n == 0 renvoie n, qui à ce stade vaut 0 , et annule donc le reste du calcul en le multipliant par zéro.
7.
a. La fonction récursive commence à renvoyer correctement des valeurs au cas de base n == 0. 0! = 1.
8.
b. Le cas de base n == 1 n'est pas utilisé dans la fonction. Lorsque n vaut 0 , la multiplication globale devient 0 . La récursivité commence à renvoyer des valeurs dès que le cas de base n < 0 est atteint, renvoyant initialement -1. Mais l'appel récursif précédent renverrait 0 , annulant ainsi tous les calculs et laissant un résultat global de 0 .

12.3 Récursivité avec des chaînes et des listes

1.
b. Une fois converti entièrement en minuscules, le mot "madam" est un palindrome, la fonction reconnaîtra donc le mot comme étant un palindrome.
2.
a. Lorsqu'un palindrome comporte un nombre pair de lettres, il reste finalement une chaîne vide à mesure que les paires de lettres sont supprimées. Par conséquent, le cas de base doit inclure len(word) == 0, ce qui est résolu avec la condition len(word) <= 1.
3.
b. La fonction strip() supprime une lettre donnée au début et à la fin de la chaîne, y compris les lettres répétées. Lorsque strip('m') est utilisé avec "madamm" , la chaîne résultante est "ada" .
4.
a. Les deux listes contiennent les mêmes éléments dans un ordre différent.
5.
b. Les deux listes ont quatre éléments en commun, mais list_num a un 15 supplémentaire et other_list a un 22 supplémentaire.
6.
a. Les deux listes contiennent les mêmes éléments dans un ordre différent. La fonction fonctionne pour des éléments de n'importe quel type.
7.
a. Les deux listes contiennent les mêmes éléments dans un ordre différent. La fonction fonctionne pour des éléments de n'importe quel type, y compris d'autres listes.
8.
a. Les deux listes contiennent les mêmes éléments dans le même ordre.

12.4 Approfondissement de la récursivité mathématique

1.
c. fib(9) = fib(8) + fib(7). fib(9) = fib(8) + fib(7) = 21 + 13 = 34.
2.
c. Il y a huit appels aux cas de base comme le montre l'animation. Ces appels permettent à la récursivité de renvoyer des valeurs et de calculer la valeur finale.
3.
b. La structure qui montre quels appels de fonction sont effectués est appelée un arbre de récursivité. Un arbre de récursivité peut être utilisé pour suivre la façon dont les valeurs finales sont calculées.
4.
c. 5 * 3 = 15 et 5 * 7 = 35, donc 5 est le plus grand commun diviseur de 15 et 35 .
5.
a. Le premier appel gcd(24, 30) produit 30 - 24 = 6, donc l'appel suivant est gcd(24, 6). Par la suite, les autres appels sont gcd(18, 6), gcd(12, 6) et gcd (6,6), pour un total de quatre appels récursifs après l'appel de fonction initial.
6.
b. Lorsque les deux nombres n'ont aucun diviseur commun, le PGCD est 1.
7.
b. Le premier appel gcd(13, 23) produit 23 - 13 = 10, donc l'appel suivant est gcd(13, 10). Par la suite, les autres appels sont gcd(10, 3), gcd(7, 3), gcd (4,3), gcd(3,2), gcd(2,1) et gcd(1,1), pour un total de huit appels.

12.5 Utiliser la récursivité pour résoudre des problèmes

1.
c. Ce tableau est trié par ordre croissant, ce qui est nécessaire pour utiliser l'algorithme de recherche binaire.
2.
a. mid = (4 + 7) // 2 = 11 // 2 = 5. L'opérateur // est utilisé pour la division entière.
3.
a. Le premier appel a pour résultat que mid vaut 3 , ensuite mid devient 5 , et enfin, mid devient 4 . L'élément trouvé à l'indice 4 est égal à la clé 16 .
4.
a. Le premier appel a pour résultat que mid vaut (0 + 13) // 2 = 6. L'appel suivant donne mid (7 + 13) // 2 = 10. L'appel suivant donne mid (11 + 13) // 2 = 12. À ce stade, 86 < 99, donc le dernier appel est vers mid 11, après quoi il n'y a plus nulle part où aller.
5.
b. Comme on le voit dans l'exemple de code pour trois anneaux, la solution nécessite sept étapes. Les sept étapes sont appelées deux fois, avec une étape supplémentaire, pour un total de 2 x 7 + 1 = 15.
6.
a. La solution itérative des Trois Tours nécessite nettement plus de code et utilise des fonctionnalités de programmation supplémentaires.