• Aucun résultat trouvé

Exercice 1 : Récursivité/ 5Un utilisateur souhaite écrire une fonction récursive pourobtenir une série de nombres entiers décroissant de n à 0  Exemple : pour n = 5, retourner [ 5, 4, 3, 2, 1, 0 ]

N/A
N/A
Protected

Academic year: 2022

Partager "Exercice 1 : Récursivité/ 5Un utilisateur souhaite écrire une fonction récursive pourobtenir une série de nombres entiers décroissant de n à 0  Exemple : pour n = 5, retourner [ 5, 4, 3, 2, 1, 0 ]"

Copied!
4
0
0

Texte intégral

(1)

Terminale Gale - spécialité Numérique et Sciences Informatiques Date : Mardi 29 Septembre 2020 - Durée : 2h

Exercice 1 : Récursivité / 5

Un utilisateur souhaite écrire une fonction récursive pour obtenir une série de nombres entiers décroissant de n à 0  Exemple : pour n = 5, retourner [ 5, 4, 3, 2, 1, 0 ]

Quels sont : - le type de donnée que va recevoir cette fonction / - le type de donnée en retour ? / 1 Doit recevoir : n : le nombre de valeurs ( type int ) Doit renvoyer : une liste ( type list )

Par quelle(s) instruction(s) doit-il remplacer <1 - ?- > à la ligne 2 pour atteindre son objectif ? / 1 n == 0  la récursivité doit s’arrêter lorsque la valeur passée en argument est nulle

Par quelle(s) instruction(s) doit-il remplacer <2 - ?- >  à la ligne 3 pour atteindre son objectif ? / 1 return [ 0 ]  la récursivité se termine, donc on renvoie une liste qui ne contient que le premier élément Par quelle(s) instruction(s) doit-il remplacer <3 - ?- > à la ligne 5 pour atteindre son objectif ?

( Cette étape peut être décomposée sur plusieurs lignes ou regroupées sur une ligne) / 2 [n] + liste_decroissante ( n – 1 )  lorsqu’on récupère un retour de fonction (une liste) on ajoute

l’élément [n] qui va allonger la liste puis on retourne l’ensemble au fur et à mesure des dépilements.

Exercice 2 : Récursivité / 7

Un utilisateur a recopié le code d’une fonction.

Que va afficher l’instruction à la ligne 8 : print ( suite_2 ( 8 )) ?

/ 1

La fonction retourne la somme : 8 + ( 6 + ( 4 + ( 0 ) ) ) ) = 18

Pourquoi peut-on affirmer que suite_2 ( n ) est bien une fonction récursive ? / 1 C’est une fonction récursive car, dans ses instructions, elle contient un appel à elle même.

Quel(s) problème(s) l’utilisateur peut-il rencontrer avec d’autres valeurs de n lors de l’appel

de la fonction suite_2 ( n ) ? ( Précisez les valeurs de n qui justifient vos réponses ) / 2 La condition de fin n==0 ne sera jamais atteinte si :

- l’argument de la fonction est un nombre décimal non pair ou un nombre entier impaire puisque les appels récursifs se font avec des valeurs de n en n-2 → ex : n=7 → 7, 5, 3, 1, -1, -3, …

- l’argument est un entier pair négatif, pour les mêmes raisons

Par conséquent seuls les nombres entiers pairs positifs peuvent être acceptés.

Quelle(s) instruction(s) doit-il ajouter pour ne pas générer d’erreur qui pourrait bloquer l’exécution du

programme tout en avertissant l’utilisateur d’un dysfonctionnement  ? / 2

try :

assert type(n)==int and n%2==0 # Lever une exception avec assert ...

if n < 0 :

raise ValueError ( ) # exception avec raise → permet de préciser le type d’erreur : ValueError

… code de la fonction ...

except AssertionError :

print(“suite_2 ( n ) : n doit être un nombre entier positif et paire““) except ValueError :

print(“suite_2 ( n ) : n doit être un nombre entier paire positif ou nul“)

(2)

Proposer une simple modification de la ligne n°3 qui pourrait déjà résoudre certains problèmes / 1 On peut atteindre la condition de fin avec les nombres impaires ou décimaux en changeant la condition de fin : if n<=2 :

Attention toutefois : si n est négatif la fonction retourne 0 ! les tests sont donc nécessaires ...

Exercice 3 : Récursivité / 8

On souhaite coder une fonction récursive dont l’expression est donnée par les relations :

U0=1 U1=1

Un+2=Un+1+Un Sur quel intervalle de valeurs de n la fonction est-elle définie ?

(Autrement exprimé : quelles sont les valeurs de n possibles pour appeler la fonction ?) / 1 La fonction U est définie à partir de U . Si n=0 on a bien la relation U = U + U donc ₀ ₂ ₁ ₀ n doit être un nombre entier positif ou nul

Donner les différentes valeurs obtenues pour n = 2, 4 et 6. / 3

n = 2 → U = 1 n = 4 → U = 3₄ n = 6 → U = 8₆

Proposer les instructions en Python pour programmer cette fonction avec le soin d’informer l’utilisateur

de son erreur s’il ne respecte pas le domaine de validité pour la valeur de n. / 4 def fibonnaci ( n:int ) -> int :

try :

if n<0 :

raise ValueError() if type(n)!=int :

raise TypeError() if n==0 :

return 0 elif n==1 :

return 1+fibonnaci(0) else :

return fibonnaci(n-2)+fibonnaci(n-1) except ValueError :

print("fibonnaci ( n ) -> n : nombre entier positif ou nul") except TypeError :

print("fibonnaci ( n ) -> n : nombre entier") print("Pour 2 ->", fibonnaci(2))

print("Pour 4 ->", fibonnaci(4)) print("Pour 6 ->", fibonnaci(6))

Exercice 4 : Lire et comprendre / 5

Un utilisateur a recopié le code d’une fonction.

Que va afficher le programme

dans les cas où n=1, n=3 et n=1,5 : / 3 suite_4 ( 1 )

[ 1, 0, 1 ] suite_4 ( 3 )

[ 3, 2, 1, 0, 1, 2, 3 ]

Suite_4 ( 1.5 )

RecursionError: maximum recursion depth exceeded ...

(3)

Résumez en quelques mots comment fonctionne cette fonction : ce qu’elle admet comme paramètre et ce

qu’elle retourne ... / 2

Cette fonction reçoit comme paramètre, un nombre entier n positif ou nul.

Après les empilements successifs lors des appels récursifs, lorsque la condition de fin est atteinte, elle retourne l’élément central d’une liste : [0].

Puis, lors des dépilements elle ajoute en début de liste et fin de liste les valeurs passées en arguments lors des appels précédents : [ n, n-1, n-2, …, 0, …, n-2, n-1, n ]

Exercice 5 : Programmation Orientée Objet / 5

1) Que signifie le terme « Objet » dans le paradigme de la Programmation Orientée Objet ? / 1 Un objet en POO est une instance de classe, c’est une variable de type object qui peut être caractérisée par des attributs et sur laquelle peuvent s’appliquer des méthodes ou fonctions.

2) Quel est le rôle d’un constructeur dans une classe ? / 2

Le constructeur dans une classe est une fonction dont le nom est : def __init__ ( self, …) : Si l’instance de classe utilise des attributs , le constructeur réservera un espace mémoire pour chaque instance de classe afin de stocker les valeurs des attributs de chacune d’elles.

3) Si on définit une classe Voiture, que signifie [ déclarer une instance de classe Voiture ] ?

Comment coder en Python la déclaration d’une instance de classe Voiture ? / 2 Déclarer une instance de classe Voiture c’est déclarer une variable de type < class ‘Voiture’ > qui aura comme attributs, les attributs définis dans la classe Voiture et sur laquelle on pourra appliquer les procédures et fonctions définies dans la classe Voiture.

Exemple : ma_voiture = Voiture ( … )

Exercice 6 : Album photo / 10

Suite à l’exécution de la ligne 32, quelle information va être affichée dans la console Pyhon ? (justifier) / 2 La fonction .album( ) retourne le nombre de photos dans l’album.

Effectivement, on peut constater à la ligne 6 que la variable de classe __nbre_photo (ou attribut commun à tous les objets de la classe photo) est incrémentée de 1 à chaque déclaration d’instance de classe. Or, trois instances de classe photo on été déclarées aux lignes 28, 29 et 30  : image1,

image2 et image3.

L’instruction donnée à la ligne 32 va donc afficher :

« Nombre de photos dans l'album : 3 »

Quelles instructions en Python permettraient de réaliser l’information donnée en commentaire

(justifier) / 4

Ligne 13  <1 - ?- >:

photo.__nbre_photo = photo.__nbre_photo - 1 # MàJ le nbre de photos Linge 17 <2 - ?- > :

self.__largeur = larg self.__hauteur = haut Ligne 22  <3 - ?- >:

return ( self.__largeur, self.__hauteur) Ligne 26 <4 - ?- > :

return photo.__nbre_photo

(4)

On souhaite développer une application qui permet de disposer des photos sur une page de telle sorte qu’il y ait le moins de zones blanches possibles. Au besoin, on peut recadrer une image.

La largeur d’une page est de 2280 pixels par 3360 pixels pour la hauteur.

/ 4 On constate qu’on peut optimiser l’agencement des photos en regroupant les photos de type A : 300 pixels de haut (400pix de large) avec celles de type B : 300 pixels de haut et 200 de large. Par conséquent on peut réaliser une ligne A-B-A-B-A-B-A

soit A(400px) x 4 + B(200px) x 3 → 2200 pixels ( reste 80 pixels )

On peut superposer verticalement deux photos de type C : 300 pixels de large et 200 pixels de haut pour former un image cd 300 pix de large et 400 de haut soit la même hauteur que les photos de type D : 300 de large et 400 pixels de haut.

Par conséquent on peut réaliser une ligne D-(CC)-D-(CC)-D-(CC)-D soit D(300px) x 4 + CC(300px) → 2100 pixels ( reste 180 pixels )

Pour associer les rangées de 300 pixels de haut et celles de 400 pixels de haut, une des

meilleures combinaisons est 6 rangées de 300 et 4 rangées de 400 soit un total de 3400 pixels → il faudra donc recadrer légèrement la dernière rangée de 40 pixels

soit : 5 rangées h300 , 4 rangées de h400 et 1 rangée h300 recadrées à h260 px

# pour rangees allant de 0 à 9 exclu ( 9 rangées pleines hauteur )

# Si rangees est nul ou paire → hauteur 300 pixels (ligne de 7 photos ABABABA)

# pour i allant de 0 à 7

# si i est nul ou paire

# retirer de la liste une photo de largeur 400 pixels ( A )

# sinon

# retirer de la liste une photo de largeur 200 pixels ( B )

# afficher la photo

# se déplacer de 300 pixels vers le bas pour la prochaine ligne

# sinon → hauteur 400 pixels (ligne de 7 photos D-(CC)-D-(CC)-D-(CC)-D )

# pour i allant de 0 à 7 si i est nul ou paire

# retirer de la liste une photo de hauteur 400 pixels ( D )

# afficher la photo

# sinon

# pour j allant de 0 à 2

# retirer de la liste une photo de hauteur 200 pixels ( D )

# afficher la photo

# si j==0 descendre de 200 pixels

# remonter de 200 pixels

# pour i allant de 0 à 7 -> dernière rangée => photos à recadrer si i est nul ou paire

# retirer de la liste une photo de hauteur 400 pixels ( D )

# recadrer l’image à 300 px de largeur et 360 px de haut

# afficher la photo

# sinon

# pour j allant de 0 à 2

# retirer de la liste une photo de hauteur 200 pixels ( D )

# si j==1 recadrer l’image 300px large ; 160 px de haut

# afficher la photo

# si j==0 descendre de 200 pixels

# remonter de 200 pixels

Références

Documents relatifs

&amp;RPPHQWPHVXUHWRQOD FDSDFLWp&#34; 7kFKHGHGpWHFWLRQGHVWUDLWV7RZQVHQGHWDODOWHUQDQW DYHFODWkFKHGHUHFKHUFKHYLVXHOOHORUVGHVSUHPLqUHV VHVVLRQV 'HX[TXHVWLRQV

[r]

[r]

[r]

Parmi les chaudières sous garantie, la probabilité qu’une chaudière soit défectueuse est de 1 100.. Calculer la probabilité de

Pour chacune de ces affirmations, dire si elles sont vraie ou fausse, en justifiant votre réponse à l’aide d’une propriété, d’un calcul ou d’un contre-exemple..

[r]

2-c) Pour allumer une lampe avec une pile il faut mettre les deux bornes de la lampe en contact avec les deux bornes de la pile.. 3-a) L'interrupteur permet de commander le passage