Exercices
Chapitre 3: Fonctions récursives
1 Fonction factorielle
On rappelle que factorielle de n (notée ) est définie ainsi:
Par exemple:
- ,
- ,
- .
- Écrire une fonction itérative (non récursive) appelée
factorielle
qui prend un paramètren
entier en entrée et qui renvoie le factoriel den
en sortie. - Écrire une version récursive de cette fonction appelée
factorielle_rec
.
2 Suite de Fibonacci
La suite de Fibonacci est une suite de nombres entiers définie par récurrence.
Les deux premiers termes sont 0 et 1, puis un terme est la somme des deux termes précédents.
On obtient ainsi les nombres dits de Fibonacci: 0, 1, 1, 2, 3, 5, 8, 13, 21…
La définition mathématique est:
- Écrire une version récursive
fibo
qui calcule le terme de la suite de Fibonacci. Par exemple:fibo(7)
renvoie 13. - Écrire une fonction itérative (non récursive)
fibo_iter
.
3 Parité d’un entier naturel
La fonction est_pair
définie ci-dessous indique si un entier naturel est pair ou non.
Écrire une version récursive de cette fonction est_pair_rec
.
4 Fonction somme
On autorise seulement deux opérations sur les entiers:
- Ajouter 1;
- retrancher 1.
La fonction somme
définie ci-dessous renvoie la somme de deux entiers positifs avec ces deux opérations.
- Écrire une version récursive de cette fonction
somme_rec
. - Adapter le code des fonctions
somme
etsomme_rec
afin de pouvoir renvoyer la somme de deux entiers quelconques.
5 Somme des éléments d’une liste
- Écrire une fonction récursive avec accumulateur
somme_list_rec(tab:list, somme=0) -> int:
qui prend un paramètre une liste de nombres et renvoie la somme des termes de cette liste. Par exemple:somme_list_rec([4, 7, 2])
renvoie13
. - Expliquer le déroulement de l’exécution de cette fonction lors de l’appel
somme_list_rec([4, 7, 2])
. On pourra s’aider du site http://pythontutor.com/.
6 Inversion d’une chaîne de caractères
Écrire une fonction récursive avec accumulateur inverse(txt:str, inv="") -> str:
qui prend en paramètre une chaîne de caractères txt
et qui renvoie la chaîne en inversant l’ordre des lettres. Par exemple: inverse("azerty")
renvoie ytreza
.
7 Utilisation d’accumulateurs dans la suite de Fibonacci
Le calcul des nombres de Fibonacci est rendu beaucoup plus efficace en utilisant des accumulateurs qui retiennent les valeurs des deux termes précédents afin d’éviter de les recalculer.
Compléter le code ci-dessous pour mettre en pratique cette technique.
Comparer l’efficacité de ces deux algorithmes en calculant un terme de rang assez élevé.
Chronométrer ces deux algorithmes grâce à la méthode
time.time