T.P. Récursivité I Recherche d’un élément dans une liste triée 1

Lycée Victor Hugo IPT2 2016-2017
T.P. Récursivité
I Recherche d’un élément dans une liste triée
1 Recherche basique dans une liste non triée
Écrire une fonction récursive testant si un élément aappartient à une liste Ldonnée
quelconque. On s’interdira ici d’utiliser l’instruction in.
Préciser la complexité de cette fonction
2 Recherche plus efficace dans le cas d’une liste triée
On suppose ici la liste constituée d’entiers et triée par ordre croissant. Par exemple :
>>> l =[2 ,7 ,12 ,15 ,18 ,24]
L’algorithme consiste à regarder l’élément en « milieu » de liste et à le comparer à l’élément
arecherché et à en déduire quelle partie de la liste peut potentiellement contenir a.
1. Préciser pour quels cardinaux de la liste, on se retrouve dans un cas de base (c’est-à-dire
pour lesquels l’algorithme peut rendre directement le résultat sans appel récursif)
2. Écrire une fonction récursive dans_triee testant si un élément aappartient à une liste
triée Ldonnée en paramètre. Dans un premier temps, on utilisera l’appel à une sous-liste.
On rappelle que si `est une liste, `[i:j]renvoie la sous liste de `contenant les éléments
d’indice iàj1.
L’algorithme précédent n’est pas satisfaisant. On peut montrer que sa complexité est O(n)
(où nest la taille de la liste) car le fait de prendre une sous-liste demande de copier tous
les éléments et prend, au pire, un temps O(n).
3. Écrire une fonction récursive dans_triee2 qui prend en argument a,L, et deux indices i
et jet qui renvoie True si et seulement si aest contenue entre les indices iet jde L.L
n’est pas modifiée, seuls les indices iet jpeuvent changer lors d’un appel récursif.
4. Quelle est la complexité dans le pire des cas de dans_triee2 ?
5. Écrire enfin une version itérative dans_triee_it efficace de la recherche dichotomique
dans une liste triée.
II Le calcul des coefficients binomiaux
On cherche ici différentes méthodes, de plus en plus efficaces, pour déterminer les coefficients
binomiaux.
1 Par la formule utilisant des factorielles
Dans ce paragraphe, on utilise la formule explicite donnant le coefficient binomial n
p!à
l’aide de factorielles.
1
Lycée Victor Hugo IPT2 2016-2017
1. Rappeler cette formule.
2. Écrire le code Python de la fonction factorielle. Quelle est sa complexité ?
3. Écrire le code Python de la fonction binomial qui rend pour résultat le coefficient binomial
du couple de paramètres (n, p)calculé à l’aide de cette formule. On fera attention à ce que
le résultat soit un entier (donc de de type int)
4. Quelle est la complexité de cette fonction ?
5. Tester votre fonction sur 4
2!, 37
2!, 50
25!et 1000
2!. Pour ce dernier calcul, n’est-il pas
plus simple de faire l’opération mentalement (voire de la poser) ?
2 Par la formule de Pascal
Dans ce paragraphe, on utilise la formule de Pascal : n
p!= n1
p1!+ n1
p!.
On veut ici écrire une fonction récursive Python nommée binomial2 utilisant cette formule.
On convient de définir n
p!pour tout couple (n, p)N2et notamment n
p!= 0 si p>n.
1. Cette dernière définition est-elle pertinente ?
2. Pour quels couples d’entiers naturels la formule de Pascal n’est-elle pas valable ?
3. Quels couples (n, p)vont ainsi constituer la base de la fonction binomial2 ?
4. Dans le tableau ci-dessous, selon la position du couple (n, p), indiquer la suite des argu-
ments avec lesquels on appelle successivement la fonction binomial2.
0123456
0
1
2
3
4
5
6
0123456
0
1
2
3
4
5
6
0123456
0
1
2
3
4
5
6
5. Écrire le code Python de la fonction binomial2. Estimer la complexité de cette fonction ?
6. Tester votre fonction sur 4
2!, 37
2!, 50
25!et 1000
2!.
7. Préciser les limites de ce choix de programmation en le testant si nécessaire encore avec
d’autres exemples.
8. Étudier pour nfixé le nombre d’additions effectuées en fonction de p. On pourra pour cela
créer une nouvelle fonction récursive compte qui rend ce nombre d’additions. Pour quelles
valeurs de pce nombre est-il maximal ?
3 Par une autre formule souvent utile
Dans ce paragraphe, on utilise la formule : n
p!=n
p× n1
p1!.
On veut ici écrire une fonction récursive Python nommée binomial3 utilisant cette formule.
1. Pour quels couples (n, p)est-elle valable ?
2. Quels arguments du couple(n, p)seront successivement appelés ? (On pourra encore utiliser
les tableaux de la question 4 du paragraphe 2).
2
Lycée Victor Hugo IPT2 2016-2017
3. Écrire le code Python de la fonction binomial3, toujours en veillant à obtenir un résultat
de type entier. Quelle est la complexité de cette fonction ?
4. Tester votre fonction sur 4
2!, 37
2!, 50
25!et 1000
2!et conclure.
III La suite de Syracuse
On a rencontré en cours la suite de Syracuse ; en voici la version «compressée» définie par la
récurrence ci-dessous (où cNest une constante d’initialisation donnée) :
a0=cet nN, an+1 =
an
2si anest pair
3an+ 1
2si anest impair
1 Analyse de la longueur du vol
1. Écrire le code Python d’une fonction récursive vol de paramètre cqui rend la liste des
différentes valeurs de la suite de Syracuse initialisée à c(et arrêtée à 1).
On s’arrête à 1 dans la mesure où à partir de 1, on retrouve la suite [2,1,2,1,...].
Exemple de résultat attendu :
>>> vol (15) :
[15 , 23 , 35 , 53 , 80 , 40 , 20 , 10 , 5 , 8 , 4, 2 , 1]
2. Écrire le code Python de la fonction longueurDuVol de paramètre c. Elle rendra pour
résultat le plus petit indice nNpour lequel un= 1.
3. Écrire le code Python de la fonction volMaximal de paramètre entier nqui rend le couple
constitué de la valeur c6npour lequel on obtient le vol de longueur maximale, et de la
longueur de ce vol. Exemple de résultat attendu :
>>> vo lM aximal (1000)
(871 , 113)
4. Écrire le code Python de la fonction listeDesRecordsVolMaxi de paramètre entier nqui
rend la liste des couples (c, vol)des différents records obtenus lorsqu’on fait varier cde 1
àn. Exemple de résultat attendu :
>>> l iste DesR ecor dsVo lMax i (20)
[(1 , 0) , (2 , 1) , (3 , 5) , (6 , 6) , (7 , 11) , (9 , 13) , (18 , 14) ]
2 Analyse de l’altitude maximale atteinte
1. Écrire le code Python d’une fonction récursive maximumListe dont le paramètre est une
liste d’entiers ou de flottants let qui rend le maximum des éléments de cette liste.
2. Écrire le code Python de la fonction altitudeMax1Vol de paramètre entier cqui rend
l’altitude maximale atteinte pour un vol initialisé à c. Exemple de résultat attendu :
>>> a ltitu deMax 1Vol (9663)
13557212
3. Écrire le code Python de la fonction altitudeMaxVols de paramètre entier net qui rend
pour résultat le couple (c, alt)cla valeur du paramètre donnant l’altitude maximale
alt atteinte parmi tous les vols obtenus en faisant varier cde 1àn..
3
Lycée Victor Hugo IPT2 2016-2017
>>> a ltitu deMax Vols (1000)
(703 , 125252)
4. Écrire le code Python de la fonction listeDesRecordsAltitudeMaxi de paramètre entier
nqui rend la liste des couples (c, alt)des records d’altitude obtenus en faisant varier cde
1àn.
>>> listeDesRecordsAltitudeMaxi(100)
[(1 , 1) , (2 , 2) , (3 , 8) , (7 , 26) , (15 , 80) , (27 , 4616) ]
5. Atteindre une altitude maximale garantit-il un vol de longueur maximale ?
4
1 / 4 100%
La catégorie de ce document est-elle correcte?
Merci pour votre participation!

Faire une suggestion

Avez-vous trouvé des erreurs dans linterface ou les textes ? Ou savez-vous comment améliorer linterface utilisateur de StudyLib ? Nhésitez pas à envoyer vos suggestions. Cest très important pour nous !