Quelques questions Python

Résolu/Fermé
rubbb Messages postés 4 Date d'inscription lundi 6 février 2023 Statut Membre Dernière intervention 18 avril 2023 - Modifié le 18 avril 2023 à 07:56
rubbb Messages postés 4 Date d'inscription lundi 6 février 2023 Statut Membre Dernière intervention 18 avril 2023 - 18 avril 2023 à 09:26

Bonjour,

dans le cadre d'un concours, j'ai eu une épreuve portant sur le programme de Terminale NSI. Cependant, pour quelques questions, je ne suis pas sûr de certaines de mes réponses. Alors si certaines personnes veulent bien m'éclairer, je suis preneur.

Tout d'abord, quelques précisions. Cette épreuve se présente sous le format d'un QCM avec 4 choix (A, B, C, D) pour chaque question. Pour chaque question, seules 0, 1 ou 2 réponses possibles. Si 0 réponse valable, il fallait cocher la case E sur la feuille de réponse.

Voici les questions où j'ai des doutes, soit sur ma réponse, soit sur une ambiguïté dans l'énoncé:

Question 1:

Le programme suivant définit un arbre binaire à l'aide d'instance d'une classe Noeud. Selon ce programme, qui est le petit fils gauche du noeud "A"?
 

x, b = Noeud("X"), Noeud("B")

x.droit = Noeud("A")

c, d, e = Noeud("C"), Noeud ("D"), Noeud("E")

c.gauche = b

x.droit.droit = d

x.gauche = Noeud("G")

x.gauche.gauche = Noeud("H")

d.gauche, d.droit = c, e

Réponse:

A) "A"

B) "B"

C) "C"

D) "D"

E) Aucune réponse valable.

Ce qui donnait selon moi l'arbre suivant:

               (X)

       (G)           (A)

(H)                          (D)

                        (C)          (E)

               (B)

On cherche ici le petit-fils gauche de A.

On voit ici que A a un seul fils: D, fils droit de A

Les petits fils de A sont par conséquent:

-C, fils gauche de D

-E, fils droit de D

Ma question est: comment peut-on interpréter la consigne?

1) C étant le fils gauche de D, peut on le considérer alors petit fils gauche de A?

2) A n'ayant pas de fils gauche, il ne peut avoir, de fait, de petit fils gauche?

J'ai opté pour la réponse C) avec C comme petit fils gauche: A a deux petits fils, un à gauche et un à droite de leur nœud parent D, même si ce dernier est fils droit de A.
Je veux bien vos avis sur la question tout de même.

Question 2:

(Petite question SQL, désolé du HS, mais si vous avez la réponse, je suis preneur. Et si je ne trouve pas de réponse ici, j'irai la poster sur le sous-forum idoine)

Qu'est-ce que la contrainte de relation dans une base de données?

A) La définition des domaines de valeurs pour chaque attribut.

B) L'utilisation d'un attribut identifiant de manière unique chaque enregistrement d'une table.

C) L'impossibilité de supprimer un enregistrement dont d'autres dépendent.

D) L'utilisation d'au moins deux tables liées par une clé étrangère et une clé primaire.

E) Aucune réponse valable.

Ici j'ai répondu la réponse C. Y a-t-il une autre réponse valable (rappel, jusqu'à 2 réponses valables par question) parmi les 3 autres? On me souffle dans l'oreille que la D était à cocher aussi.

Question 3:

Quelle technique d'optimisation algorithmique est utilisée dans la recherche dichotomique?

A) La programmation dynamique.

B) La méthode "diviser pour régner".

C) La récursivité.

D) La modularité.

E) Aucune réponse valable.

Ici j'ai choisi la réponse B car j'avais souvenir que cette méthode était utilisée pour la recherche dichotomique dans le manuel de terminale. Or c'était surtout évoqué pour le tri fusion. Cependant, à propos de la recherche dichotomique et la méthode "diviser pour régner", on trouve ceci dans mon manuel de terminale:

"La recherche dichotomique est vue par certains auteurs comme un cas un peu trivial de la technique "diviser pour régner" dans laquelle on n'a qu'un sous problème à résoudre"

J'ai aussi pensé à la récursivité, mais après recherche sur Google, la recherche dichotomique peut aussi se faire de manière itérative.

Bref, là aussi, je nage en plein doute.

Question 4:

Quel est le coût de l'algorithme de calcul du n-ième terme de la suite de Fibonacci implémenté ici en Python?

def fibo(n):
    if n <= 1:
         return n
    else:
         return fibo(n-2) + fibo(n-1)

A) Coût constant.

B) Coût linéaire.

C) Coût quadratique.

D) Coût exponentielle.

E) Aucune réponse valable.

Pour cette question, j'ai opté pour le coup linéaire. Est-ce bon?



Pour les autres questions, soit je sais que je suis juste, soit je sais que je me suis planté, donc je ne devrais pas avoir trop de surprise les concernant.

Un grand merci d'avance à ceux qui voudront bien m'éclairer!
Windows / Firefox 102.0

2 réponses

yg_be Messages postés 22729 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
Modifié le 18 avril 2023 à 09:06

bonjour,

je pense que j'aurais répondu comme toi. 
A part pour la question 2, j'aurais mis E.
A part pour la question 4, ce n'est surement pas linéaire. cela me semble plutôt exponentiel.

0
rubbb Messages postés 4 Date d'inscription lundi 6 février 2023 Statut Membre Dernière intervention 18 avril 2023
18 avril 2023 à 09:26

Oui la 4 j'ai hésité entre linéaire et exponentiel. J'ai tranché et du mauvais côté visiblement.

Par curiosité, j'ai demandé à ChatGPT son avis. Même si très souvent ses réponses sont complètement à côté de la plaque, sur des questions théoriques ça pouvait le faire. Voici ses réponses:

-Pour la question 1 il semble bien avoir la même interprétation de l'arbre que je fais. Cependant, pour lui, le petit-fils gauche de A est le nœud B. Soit c'est moi qui suis complètement à l'ouest sur cette question, soit la réponse de ChatGPT est incohérente (mais sur des questions d'ordre pratique, c'est souvent le cas je trouve)

-Pour la question 2, sa réponse:

La réponse est D) L'utilisation d'au moins deux tables liées par une clé étrangère et une clé primaire.

La contrainte de relation dans une base de données se réfère à la façon dont les tables dans une base de données sont liées les unes aux autres. Cela implique l'utilisation de clés étrangères et de clés primaires pour établir des relations entre les enregistrements dans différentes tables.

Les clés primaires sont utilisées pour identifier de manière unique chaque enregistrement dans une table spécifique, tandis que les clés étrangères sont utilisées pour lier les enregistrements d'une table à ceux d'une autre table. La contrainte de relation garantit que les données dans les tables liées sont cohérentes et exactes en empêchant les insertions ou les mises à jour de données qui violeraient l'intégrité de la relation entre les tables.

Là ça me semble plus cohérent. Si c'est bien ça, j'ai mal interprété le mot "relation" dans l'énoncé. Une table étant aussi appelé une relation dans mon bouquin, j'ai eu une compréhension un peu différente. Egalement, le terme de "contrainte de relation" n'est pas explicitement utilisé dans mon manuel, même si bien sûr, les notions de clés primaires, étrangères font bien l'objet de paragraphes dans les chapitres dédiés à SQL.

-Pour la question 3:

La réponse est B) La méthode "diviser pour régner".

La recherche dichotomique est un algorithme d'optimisation qui utilise la méthode "diviser pour régner" pour rechercher efficacement un élément dans une liste triée. Cette méthode consiste à diviser répétitivement la liste en deux parties égales et à déterminer dans quelle partie l'élément recherché peut se trouver. Le processus se poursuit jusqu'à ce que l'élément soit trouvé ou que la liste soit entièrement parcourue.

La méthode "diviser pour régner" est une technique d'optimisation algorithmique qui consiste à diviser un problème en sous-problèmes plus petits et plus simples, résoudre chaque sous-problème de manière récursive, puis combiner les résultats pour résoudre le problème d'origine. Cette technique est souvent utilisée dans la conception d'algorithmes efficaces pour de nombreux problèmes de calcul, tels que la recherche, le tri et la fusion de données.

On va croiser les doigts pour qu'il ne raconte pas de bêtise sur cette question.

Pour la question 4, il démontre que c'est effectivement exponentiel. Après coup je me sens bien bête d'avoir hésité, mais c'est toujours plus simple avec du recul, avec la solution,...

La réponse est D) Coût exponentiel.

L'algorithme de calcul du n-ième terme de la suite de Fibonacci implémenté ici en Python utilise la récursivité pour calculer le terme souhaité. La fonction appelle récursivement elle-même deux fois pour les valeurs n-2 et n-1 et les ajoute pour obtenir le n-ième terme de la suite.

Le coût de cet algorithme est exponentiel, car pour calculer le n-ième terme, il doit appeler la fonction pour les valeurs n-2 et n-1, chacune de ces fonctions à son tour appelant la fonction pour les valeurs n-4, n-3 et ainsi de suite jusqu'à atteindre la condition d'arrêt pour n=0 ou n=1.

Par conséquent, plus n est grand, plus le nombre d'appels de la fonction augmente de manière exponentielle, ce qui rend l'algorithme très inefficace pour de grandes valeurs de n.

0