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.
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.
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"
.
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.
12.4 Approfondissement de la récursivité mathématique
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.
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.
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.
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.