QCM : Algorithmique et bases de Python — 43 questions

Questions et réponses du QCM

1. Concernant la définition d’un algorithme :

Un algorithme transforme une information symbolique d’entrée en information symbolique de sortie.
Un algorithme transforme nécessairement des données numériques en images.
Chaque opération élémentaire d’un algorithme est réalisable en temps fini.
Un algorithme repose sur un nombre fini d’opérations élémentaires.
Un algorithme nécessite une quantité infinie d’opérations pour produire son résultat.

Un algorithme transforme une information symbolique d’entrée en information symbolique de sortie. · Chaque opération élémentaire d’un algorithme est réalisable en temps fini. · Un algorithme repose sur un nombre fini d’opérations élémentaires.

Explication

Un algorithme transforme une information symbolique d’entrée en une information symbolique de sortie par un nombre fini d’opérations élémentaires. Ces opérations doivent être réalisables en temps fini ; une infinité d’opérations ne constitue donc pas un algorithme exécutable.

2. Parmi les propositions suivantes concernant la finitude d’un algorithme exécutable, la(les)quelle(s) est(sont) exacte(s) ?

Une infinité d’opérations peut être exécutée comme telle par un ordinateur.
La finitude concerne le nombre d’opérations nécessaires à l’exécution.
Un procédé nécessitant une infinité d’opérations ne peut pas être exécuté comme tel par ordinateur.
Un algorithme exécutable comporte un nombre fini d’opérations élémentaires.
Un procédé infini constitue un algorithme exécutable dès que chaque opération est simple.

La finitude concerne le nombre d’opérations nécessaires à l’exécution. · Un procédé nécessitant une infinité d’opérations ne peut pas être exécuté comme tel par ordinateur. · Un algorithme exécutable comporte un nombre fini d’opérations élémentaires.

Explication

Un algorithme exécutable doit comporter un nombre fini d’opérations élémentaires. Un procédé demandant une infinité d’opérations ne peut pas être exécuté comme tel par un ordinateur.

3. La description effective d’un algorithme comprend :

Des spécifications précisant le problème traité.
Des opérations élémentaires correctement indentées et commentées.
Des préconditions définissant les conditions d’utilisation.
Un nom identifiant l’algorithme décrit.
Des entrées et des sorties clairement indiquées.

Des spécifications précisant le problème traité. · Des opérations élémentaires correctement indentées et commentées. · Des préconditions définissant les conditions d’utilisation. · Un nom identifiant l’algorithme décrit. · Des entrées et des sorties clairement indiquées.

Explication

La description effective précise le nom, les spécifications, les entrées, les sorties, les préconditions et les opérations élémentaires. Ces opérations doivent aussi être correctement indentées et commentées, ce qui justifie les cinq réponses exactes.

4. Concernant l’implémentation d’un algorithme, cochez la (les) proposition(s) exacte(s) :

L’implémentation rend l’algorithme indépendant de tout langage informatique.
L’implémentation produit une représentation comprise effectivement par une machine.
L’implémentation consiste à traduire le code machine en pseudo-code.
Le pseudo-code constitue déjà un langage directement exécutable par toute machine.
L’implémentation traduit un algorithme écrit en pseudo-code.

L’implémentation produit une représentation comprise effectivement par une machine. · L’implémentation traduit un algorithme écrit en pseudo-code.

Explication

L’implémentation traduit un algorithme écrit en pseudo-code dans un langage effectivement compris par une machine. Le pseudo-code décrit l’algorithme, tandis que le code exécutable réalise cette traduction ; les autres propositions inversent ou déforment cette distinction.

5. Quelles sont les réponses exactes au sujet des paradigmes impératif et fonctionnel ?

La programmation impérative exécute des opérations successives.
La programmation impérative modifie l’état des données.
La programmation fonctionnelle emboîte des fonctions.
La programmation fonctionnelle modifie l’état après chaque opération.
La programmation fonctionnelle utilise des données immuables.

La programmation impérative exécute des opérations successives. · La programmation impérative modifie l’état des données. · La programmation fonctionnelle emboîte des fonctions. · La programmation fonctionnelle utilise des données immuables.

Explication

La programmation impérative enchaîne des opérations qui modifient l’état des données. La programmation fonctionnelle emboîte des fonctions et utilise des données immuables ; elle ne se définit donc pas par la modification successive de l’état.

6. À propos de la complexité algorithmique :

Elle décrit la syntaxe d’un langage indépendamment de l’exécution.
Elle remplace l’étude de la correction par une mesure de durée.
Elle évalue la couleur utilisée pour représenter les variables.
Elle étudie la mémoire nécessaire à l’exécution d’un algorithme.
Elle étudie le temps nécessaire à l’exécution complète d’un algorithme.

Elle étudie la mémoire nécessaire à l’exécution d’un algorithme. · Elle étudie le temps nécessaire à l’exécution complète d’un algorithme.

Explication

La complexité étudie le temps nécessaire à l’exécution complète d’un algorithme ainsi que la mémoire mobilisée pendant cette exécution. Elle ne se limite donc pas à la durée d’exécution.

7. Les quatre critères essentiels d’un programme comprennent :

Sa correction.
Sa complexité.
Sa terminaison.
Sa spécification.
Sa portabilité entre différents systèmes.

Sa correction. · Sa complexité. · Sa terminaison. · Sa spécification.

Explication

Les quatre critères essentiels sont la spécification, la terminaison, la correction et la complexité. La lisibilité et la portabilité peuvent être utiles, mais elles ne font pas partie des quatre critères énumérés ici.

8. Concernant les types numériques Python, la(les)quelle(s) est(sont) exacte(s) ?

Le type float représente des chaînes de caractères numériques.
Le type float représente des nombres flottants.
Le type int représente principalement les nombres complexes.
Le type int représente les nombres entiers.
Les nombres float approchent les nombres réels.

Le type float représente des nombres flottants. · Le type int représente les nombres entiers. · Les nombres float approchent les nombres réels.

Explication

Le type int représente les entiers, tandis que float représente des nombres flottants qui approchent les réels. Les deux types ne correspondent donc pas respectivement aux caractères et aux nombres complexes.

9. Une division euclidienne de aa par bb, avec bb strictement positif, vérifie :

La condition 0⩽r<b0\leqslant r<b.
Un quotient nécessairement positif.
Un reste pouvant être égal à bb.
Un reste nécessairement égal à zéro.
La relation a=qb+ra=qb+r.

La condition $$0\leqslant r<b$$. · La relation $$a=qb+r$$.

Explication

Pour une division euclidienne par un entier strictement positif, on a a=qb+ra=qb+r avec 0⩽r<b0\leqslant r<b. Le quotient peut être négatif, tandis que le reste reste compris entre zéro inclus et le diviseur exclu.

10. Concernant les opérateurs de division en Python :

L’opérateur % donne le reste de la division euclidienne.
L’opérateur % produit le quotient de la division euclidienne.
L’opérateur / produit une valeur flottante.
L’opérateur // donne le quotient de la division euclidienne.
L’opérateur / produit un quotient entier dans tous les cas.

L’opérateur % donne le reste de la division euclidienne. · L’opérateur / produit une valeur flottante. · L’opérateur // donne le quotient de la division euclidienne.

Explication

En Python, l’opérateur // fournit le quotient de la division euclidienne, % fournit le reste et / produit un flottant. Les propositions qui attribuent le reste à // ou un quotient entier à / sont donc incorrectes.

11. À propos de la représentation des nombres flottants en Python, cochez la (les) proposition(s) exacte(s) :

La précision des flottants est limitée.
Les flottants sont représentés en base 2.
Des arrondis peuvent apparaître à chaque opération.
L’expression 0.1+0.2−0.30.1+0.2-0.3 peut produire 5.551115123125783e−175.551115123125783\mathrm{e}{-17}.
Les calculs flottants représentent toujours exactement les nombres décimaux.

La précision des flottants est limitée. · Les flottants sont représentés en base 2. · Des arrondis peuvent apparaître à chaque opération. · L’expression $$0.1+0.2-0.3$$ peut produire $$5.551115123125783\mathrm{e}{-17}$$.

Explication

Les flottants sont représentés en base 2 avec une précision limitée, ce qui peut provoquer des arrondis à chaque opération. Ainsi, 0.1+0.2−0.30.1+0.2-0.3 peut donner 5.551115123125783e−175.551115123125783\mathrm{e}{-17} plutôt que zéro exactement.

12. Concernant les chaînes et les booléens, cochez la (les) proposition(s) exacte(s) :

La multiplication d’une chaîne par un entier répète cette chaîne.
Une chaîne de caractères est une valeur textuelle de type str entre guillemets.
La fonction str convertit une chaîne interprétable en entier.
Un booléen peut prendre les valeurs True et False.
L’opérateur + répète une chaîne lorsqu’il est associé à un entier.

La multiplication d’une chaîne par un entier répète cette chaîne. · Une chaîne de caractères est une valeur textuelle de type str entre guillemets. · La fonction str convertit une chaîne interprétable en entier. · Un booléen peut prendre les valeurs True et False.

Explication

Une chaîne est une valeur de type str délimitée par des guillemets simples ou doubles. L’opérateur + concatène deux chaînes, tandis que la multiplication par un entier répète la chaîne. Un booléen possède les deux valeurs True et False, et la conversion vers une chaîne relève de str.

13. À propos du type booléen en Python :

Le nombre 65 constitue une valeur booléenne.
Le type booléen est défini par les valeurs int et float.
Les valeurs booléennes sont True et False.
Le type booléen possède exactement deux valeurs distinctes.
Une chaîne entre guillemets constitue une valeur booléenne.

Les valeurs booléennes sont True et False. · Le type booléen possède exactement deux valeurs distinctes.

Explication

Le type booléen possède exactement deux valeurs distinctes : True et False. Les valeurs textuelles et numériques appartiennent à d’autres types, tandis que les conversions int et float concernent respectivement les entiers et les flottants.

14. Concernant l’affectation d’une variable en Python :

L’affectation fonctionne comme une égalité mathématique symétrique.
Le signe = compare deux expressions sans modifier de variable.
Une nouvelle affectation conserve nécessairement l’ancienne valeur.
La valeur obtenue est stockée dans la variable située à gauche.
L’expression placée à droite du signe = est évaluée en premier.

La valeur obtenue est stockée dans la variable située à gauche. · L’expression placée à droite du signe = est évaluée en premier.

Explication

L’affectation évalue l’expression située à droite, puis stocke le résultat dans la variable située à gauche. Elle est donc orientée, contrairement à une égalité mathématique symétrique.

15. Quelles sont les réponses exactes au sujet du typage des variables en Python ?

Une nouvelle affectation remplace la valeur précédemment stockée.
Le typage dynamique interdit de réaffecter une variable.
Une variable doit conserver une valeur de même type durant son existence.
Le type d’une variable reste fixé après sa première affectation.
Une même variable peut recevoir successivement des valeurs de types différents.

Une nouvelle affectation remplace la valeur précédemment stockée. · Une même variable peut recevoir successivement des valeurs de types différents.

Explication

Python possède un typage dynamique : une même variable peut recevoir successivement des valeurs de types différents. Lors d’une nouvelle affectation, la valeur précédente est remplacée dans cette variable.

16. Concernant les fonctions et les listes Python, cochez la (les) proposition(s) exacte(s) :

Pour une liste de longueur n, l’accès t[k] est valide si 0≤k<n0 \leq k < n.
Une liste est une succession ordonnée de valeurs entre crochets.
Une fonction peut recevoir une ou plusieurs valeurs en entrée.
Le premier indice d’une liste Python est 1.
Une fonction peut renvoyer une valeur en sortie.

Pour une liste de longueur n, l’accès t[k] est valide si $$0 \leq k < n$$. · Une liste est une succession ordonnée de valeurs entre crochets. · Une fonction peut recevoir une ou plusieurs valeurs en entrée. · Une fonction peut renvoyer une valeur en sortie.

Explication

Une fonction reçoit des valeurs en entrée et peut renvoyer une valeur en sortie. Une liste est ordonnée, écrite entre crochets et indexée à partir de 0. L’accès t[k] est valide pour les indices compris entre 0 et n-1.

17. Parmi les propositions suivantes concernant l’indexation des listes, la(les)quelle(s) est(sont) exacte(s) ?

Une liste Python est définie entre crochets.
Un indice hors des bornes lève l’exception list index out of range.
Un indice égal à n reste valide pour une liste de longueur n.
Pour une liste de longueur n, l’indice maximal valide est n-1.
Le premier indice d’une liste Python est 0.

Une liste Python est définie entre crochets. · Un indice hors des bornes lève l’exception list index out of range. · Pour une liste de longueur n, l’indice maximal valide est n-1. · Le premier indice d’une liste Python est 0.

Explication

Une liste Python est ordonnée, délimitée par des crochets et indexée de 0 à sa longueur moins 1. Pour une liste de longueur n, un indice hors de l’intervalle valide provoque l’exception list index out of range.

18. Concernant l’évaluation logique et les structures conditionnelles, cochez la (les) proposition(s) exacte(s) :

L’instruction else correspond au cas où aucune condition précédente n’est vraie.
L’instruction if exécute son bloc lorsque sa condition est vraie.
Avec or, la seconde opérande est évaluée si la première est fausse.
Avec and, la seconde opérande est évaluée si la première est vraie.
Avec and, la seconde opérande est évaluée avant la première.

L’instruction else correspond au cas où aucune condition précédente n’est vraie. · L’instruction if exécute son bloc lorsque sa condition est vraie. · Avec or, la seconde opérande est évaluée si la première est fausse. · Avec and, la seconde opérande est évaluée si la première est vraie.

Explication

L’opérateur and évalue d’abord sa première opérande et ne poursuit avec la seconde que si la première est vraie. Dans une structure conditionnelle, elif teste d’autres conditions et else correspond au cas où aucune condition précédente n’est vraie.

19. Un programme contient des branches if, elif et else ; quelles propositions décrivent correctement son exécution ?

Les blocs elif suivants sont exécutés après le premier bloc vrai.
Le bloc else est exécuté lorsqu’aucune condition n’est vraie.
Le premier bloc dont la condition est vraie est exécuté.
Le bloc else est exécuté dès qu’une condition elif devient vraie.
Les conditions sont examinées dans l’ordre où elles apparaissent.

Le bloc else est exécuté lorsqu’aucune condition n’est vraie. · Le premier bloc dont la condition est vraie est exécuté. · Les conditions sont examinées dans l’ordre où elles apparaissent.

Explication

Python évalue les conditions if et elif dans l’ordre et exécute le premier bloc vrai. Les blocs elif suivants ne sont pas exécutés, tandis qu'else intervient lorsqu’aucune condition n’est vraie.

20. Parmi les propositions suivantes concernant if, elif et else en Python, la(les)quelle(s) est(sont) exacte(s) ?

Le bloc else intervient lorsque toutes les conditions précédentes sont fausses.
Une condition vraie dans un elif empêche l’exécution des elif qui suivent.
Les instructions d’un même bloc conditionnel utilisent une indentation uniforme.
Python évalue les conditions successives dans leur ordre d’écriture.
Une condition if vraie entraîne l’exécution de tous les blocs suivants.

Le bloc else intervient lorsque toutes les conditions précédentes sont fausses. · Une condition vraie dans un elif empêche l’exécution des elif qui suivent. · Les instructions d’un même bloc conditionnel utilisent une indentation uniforme. · Python évalue les conditions successives dans leur ordre d’écriture.

Explication

Le bloc associé à la première condition vraie est exécuté, puis les branches suivantes ne le sont pas. Si aucune condition n’est vérifiée, Python exécute le bloc else ; le bloc conditionnel reste délimité par une indentation uniforme.

21. À propos des boucles for et des accumulateurs, quelles propositions sont exactes ?

Une boucle for répète un bloc un nombre d’itérations connu à l’avance.
Un accumulateur de produit commence avec l’élément neutre zéro.
Une somme calculée par accumulation commence avec l’élément neutre zéro.
Dans range(a,b), la valeur b est attribuée à la variable de boucle.
La boucle for constitue une boucle bornée et inconditionnelle.

Une boucle for répète un bloc un nombre d’itérations connu à l’avance. · Une somme calculée par accumulation commence avec l’élément neutre zéro. · La boucle for constitue une boucle bornée et inconditionnelle.

Explication

Une boucle for est adaptée lorsque le nombre d’itérations est connu avant son démarrage. Dans range(a,b), la borne de départ est incluse et la borne b est exclue ; l’accumulateur d’une somme commence à zéro.

22. Un programme parcourt une suite d’entiers pour calculer une somme ; cochez la (les) proposition(s) exacte(s) :

Chaque terme est ajouté successivement à la valeur accumulée.
L’accumulateur de somme est initialisé à l’élément neutre de l’addition.
La borne finale de range est incluse dans les valeurs parcourues.
La variable de boucle reçoit successivement les valeurs entières de la suite.
L’accumulateur d’un produit est initialisé avec l’élément neutre de l’addition.

Chaque terme est ajouté successivement à la valeur accumulée. · L’accumulateur de somme est initialisé à l’élément neutre de l’addition. · La variable de boucle reçoit successivement les valeurs entières de la suite. · L’accumulateur d’un produit est initialisé avec l’élément neutre de l’addition.

Explication

La boucle for parcourt les valeurs de la séquence produite par range, dont la borne finale est exclue. Une somme s’accumule à partir de zéro, tandis qu’un produit s’initialise à un ; l’itération ajoute ensuite chaque terme.

23. Concernant l’utilisation de range et d’un accumulateur dans une boucle for :

Le nombre d’itérations d’une boucle for est connu avant son exécution.
La valeur b appartient à la séquence produite par range(a,b).
L’accumulateur d’une somme est initialisé à zéro.
L’appel range(a,b) peut fournir la valeur initiale a à la variable de boucle.
Chaque terme est ajouté à l’accumulateur avant le renvoi du résultat.

Le nombre d’itérations d’une boucle for est connu avant son exécution. · L’accumulateur d’une somme est initialisé à zéro. · L’appel range(a,b) peut fournir la valeur initiale a à la variable de boucle. · Chaque terme est ajouté à l’accumulateur avant le renvoi du résultat.

Explication

Pour range(a,b), les valeurs vont de a jusqu’à b-1. Pour une somme, l’accumulateur commence à zéro et reçoit chaque terme successivement ; une boucle for est bornée car son nombre d’itérations est connu avant l’entrée.

24. Quelle(s) proposition(s) caractérise(nt) correctement le choix entre les boucles for et while ?

Une boucle while répète son bloc tant qu’une condition reste vérifiée.
Une boucle while convient lorsque la durée de répétition n’est pas connue a priori.
Une boucle while termine nécessairement après un nombre fini d’itérations.
Une boucle for dépend d’une condition dont la durée peut rester inconnue.
Une boucle for convient lorsque le nombre d’itérations est connu avant son démarrage.

Une boucle while répète son bloc tant qu’une condition reste vérifiée. · Une boucle while convient lorsque la durée de répétition n’est pas connue a priori. · Une boucle for convient lorsque le nombre d’itérations est connu avant son démarrage.

Explication

La boucle for convient lorsque le nombre d’itérations est connu, tandis que while répète un bloc tant qu’une condition est vérifiée. Une boucle while peut donc avoir une durée inconnue et même ne pas terminer si la condition reste vraie.

25. Au sujet de l’algorithme d’Euclide et de la terminaison des boucles while, quelles réponses sont exactes ?

Un variant est une grandeur entière positive qui diminue strictement à chaque itération.
L’algorithme d’Euclide remplace successivement le couple par (a,b%a)\left(a, b \mathbin{\%} a\right).
L’algorithme remplace le couple par (b,a%b)\left(b, a \mathbin{\%} b\right) tant que b est positif.
Un variant peut servir à prouver qu’une boucle while termine.
L’algorithme d’Euclide renvoie la valeur de b lorsque b devient nul.

Un variant est une grandeur entière positive qui diminue strictement à chaque itération. · L’algorithme remplace le couple par $$\left(b, a \mathbin{\%} b\right)$$ tant que b est positif. · Un variant peut servir à prouver qu’une boucle while termine.

Explication

L’algorithme d’Euclide remplace successivement (a,b) par (b,a mod b) tant que b est positif, puis renvoie a. Un variant entier positif décroissant permet, quant à lui, de justifier la terminaison d’une boucle while.

26. Les propositions suivantes concernent les boucles while, les variantes et int_sqrt(n) :

Un variant croissant permet de démontrer directement la terminaison d’une boucle while.
Un variant doit être une grandeur entière positive décroissant strictement à chaque itération.
La fonction int_sqrt(n) renvoie la première valeur dont le carré devient supérieur à n.
Une condition qui reste vraie peut entraîner une boucle infinie.
La fonction int_sqrt(n) renvoie le dernier entier dont le carré est inférieur ou égal à n.

Un variant doit être une grandeur entière positive décroissant strictement à chaque itération. · Une condition qui reste vraie peut entraîner une boucle infinie. · La fonction int_sqrt(n) renvoie le dernier entier dont le carré est inférieur ou égal à n.

Explication

Une boucle while peut être infinie lorsque sa condition demeure vraie. Dans int_sqrt(n), la valeur recherchée est le dernier a satisfaisant a2≤na^2\leq n, obtenu après l’arrêt de l’incrémentation ; un variant positif strictement décroissant aide à démontrer la terminaison.

27. À propos du typage et des signatures des fonctions Python :

Le duck typing repose sur les opérations disponibles pour le type fourni.
Une annotation de type empêche les arguments d’un autre type d’être transmis.
Python exige une déclaration de type pour chaque argument reçu par une fonction.
Une signature indique notamment les types attendus et le type renvoyé.
Une fonction peut accepter un argument si les opérations utilisées lui sont applicables.

Le duck typing repose sur les opérations disponibles pour le type fourni. · Une signature indique notamment les types attendus et le type renvoyé. · Une fonction peut accepter un argument si les opérations utilisées lui sont applicables.

Explication

Python utilise le typage dynamique et le duck typing : le type n’a pas à être déclaré obligatoirement si les opérations nécessaires sont disponibles. Une signature comme `est_pair(n: int) -> bool` reste une indication documentaire.

28. Concernant la portée des variables dans les fonctions Python :

Une variable locale appartient à l’appel de fonction qui l’a créée.
Une variable locale demeure accessible après la fin de l’appel qui l’a créée.
Une variable globale peut être lue dans une fonction sans déclaration particulière.
La modification d’une variable globale dans une fonction nécessite le mot-clé `global`.
Une variable globale homonyme masque automatiquement toute variable locale.

Une variable locale appartient à l’appel de fonction qui l’a créée. · Une variable globale peut être lue dans une fonction sans déclaration particulière. · La modification d’une variable globale dans une fonction nécessite le mot-clé `global`.

Explication

Une variable globale peut être lue dans une fonction lorsqu’elle n’est pas masquée. Sa modification depuis cette fonction exige la déclaration `global`, tandis qu’une variable locale appartient à l’appel en cours.

29. Concernant les fonctions récursives, la(les)quelle(s) est(sont) exacte(s) ?

Une fonction récursive doit comporter au moins un cas de base.
Les appels récursifs doivent atteindre un cas de base après un nombre fini d’étapes.
Une fonction récursive s’appelle elle-même sur un problème similaire.
Chaque réduction récursive diminue strictement la taille du problème traité.
Une fonction récursive ne peut pas résoudre un problème composé de sous-problèmes similaires.

Une fonction récursive doit comporter au moins un cas de base. · Les appels récursifs doivent atteindre un cas de base après un nombre fini d’étapes. · Une fonction récursive s’appelle elle-même sur un problème similaire. · Chaque réduction récursive diminue strictement la taille du problème traité. · Une fonction récursive ne peut pas résoudre un problème composé de sous-problèmes similaires.

Explication

Une fonction récursive s’appelle elle-même sur un problème similaire de taille strictement inférieure. Elle doit prévoir un cas de base et atteindre celui-ci en un nombre fini d’appels.

30. Concernant l’exponentiation rapide, cochez la (les) proposition(s) exacte(s) :

La valeur de base est x0=1x^0=1.
Pour un exposant pair, la formule impose le produit supplémentaire par xx.
Pour un exposant pair, on utilise la forme (xp)2(x^p)^2.
Pour un exposant impair, un facteur supplémentaire xx intervient.
La décomposition s’écrit n=2p+rn=2p+r avec r∈{0,1}r\in\{0,1\}.

La valeur de base est $$x^0=1$$. · Pour un exposant pair, on utilise la forme $$(x^p)^2$$. · Pour un exposant impair, un facteur supplémentaire $$x$$ intervient. · La décomposition s’écrit $$n=2p+r$$ avec $$r\in\{0,1\}$$.

Explication

Pour n=2p+rn=2p+r, l’exposant pair utilise (xp)2(x^p)^2, tandis que l’exposant impair ajoute le facteur xx. Le cas x0=1x^0=1 fournit la base de l’exponentiation rapide.

31. Un calcul de x1024x^{1024} compare l’exponentiation rapide à l’algorithme naïf. Quelles propositions sont exactes ?

L’algorithme naïf utilise n+1n+1 multiplications pour calculer xnx^n.
Pour x1024x^{1024}, les deux méthodes nécessitent le même nombre de multiplications.
Pour n=2pn=2^p, l’exponentiation rapide utilise 2+p2+p multiplications.
L’exponentiation rapide utilise 12 multiplications pour x1024x^{1024}.
L’algorithme naïf utilise 1023 multiplications pour x1024x^{1024}.

Pour $$n=2^p$$, l’exponentiation rapide utilise $$2+p$$ multiplications. · L’exponentiation rapide utilise 12 multiplications pour $$x^{1024}$$. · L’algorithme naïf utilise 1023 multiplications pour $$x^{1024}$$.

Explication

Pour n=2pn=2^p, l’exponentiation rapide demande 2+p2+p multiplications, soit 12 pour x1024x^{1024}. L’algorithme naïf en demande n−1n-1, donc 1023 dans ce cas.

32. Concernant les règles des tours de Hanoï :

Un déplacement peut transférer simultanément plusieurs disques.
Les disques sont initialement empilés du plus petit au plus grand.
Un disque peut être posé sur un disque de diamètre plus petit.
Le jeu utilise trois tiges et des disques de diamètres différents.
Le déplacement vise à transférer les disques vers la troisième tige.

Le jeu utilise trois tiges et des disques de diamètres différents. · Le déplacement vise à transférer les disques vers la troisième tige.

Explication

Les tours de Hanoï comportent trois tiges et des disques initialement ordonnés du plus grand au plus petit. Un seul disque est déplacé à chaque étape, et un disque plus grand ne peut pas être posé sur un plus petit.

33. Concernant la construction récursive du flocon de Von Koch pour une génération n≥1n\geq 1 :

Le programme dessine quatre tracés de génération n−1n-1.
La dernière rotation entre deux tracés est effectuée vers la gauche de 60 degrés.
La première rotation entre deux tracés est effectuée vers la droite de 60 degrés.
Chaque tracé récursif utilise une longueur a/3a/3.
La rotation intermédiaire correspond à une rotation vers la droite de 120 degrés.

Le programme dessine quatre tracés de génération $$n-1$$. · La dernière rotation entre deux tracés est effectuée vers la gauche de 60 degrés. · Chaque tracé récursif utilise une longueur $$a/3$$. · La rotation intermédiaire correspond à une rotation vers la droite de 120 degrés.

Explication

À chaque génération n≥1n\geq 1, la construction comprend quatre tracés de génération n−1n-1, chacun de longueur a/3a/3, avec les rotations indiquées entre les tracés. La génération précédente et la longueur réduite sont donc toutes deux utilisées dans l’appel récursif.

34. Les caractéristiques de la génération 00 du flocon récursif de Von Koch comprennent :

L’utilisation de quatre segments de longueur a/3a/3.
L’appel de tracés correspondant à la génération n−1n-1.
Le tracé direct d’un segment de longueur aa.
L’application de rotations entre plusieurs tracés récursifs.
La réalisation d’une construction récursive en quatre parties.

Le tracé direct d’un segment de longueur $$a$$.

Explication

Pour la génération 00, le programme trace directement un segment de longueur aa. La construction en quatre parties et la longueur a/3a/3 concernent les générations supérieures.

35. À propos des listes Python, quelles sont les propositions exactes ?

Le premier élément d’une liste Python porte l’indice 11.
Une liste Python contient des valeurs placées dans un ordre défini.
Les valeurs d’une liste Python sont séparées par des virgules.
La notation d’une liste Python utilise des crochets.
Pour nn éléments, le dernier indice valide est n−1n-1.

Une liste Python contient des valeurs placées dans un ordre défini. · Les valeurs d’une liste Python sont séparées par des virgules. · La notation d’une liste Python utilise des crochets. · Pour $$n$$ éléments, le dernier indice valide est $$n-1$$.

Explication

Une liste Python est ordonnée, s’écrit entre crochets et sépare ses valeurs par des virgules. Ses indices commencent à 00 et se terminent à n−1n-1 pour une liste de nn éléments.

36. Une recherche séquentielle de xx dans une liste tt peut être décrite ainsi :

Elle renvoie TrueTrue dès qu’une égalité est trouvée.
Elle parcourt les indices admissibles de la liste.
Elle renvoie FalseFalse dès la première valeur différente de xx.
Elle compare chaque valeur rencontrée avec xx.
Elle renvoie FalseFalse si le parcours finit sans égalité.

Elle renvoie $$True$$ dès qu’une égalité est trouvée. · Elle parcourt les indices admissibles de la liste. · Elle compare chaque valeur rencontrée avec $$x$$.

Explication

La recherche séquentielle parcourt les indices admissibles et compare chaque élément à xx. Elle renvoie TrueTrue dès qu’une égalité est trouvée et FalseFalse lorsque le parcours se termine sans égalité.

37. Concernant l’évaluation et la recherche dans les listes, cochez la (les) proposition(s) exacte(s) :

L’évaluation progressive nécessite n+1n+1 multiplications.
La recherche dichotomique conserve les deux moitiés après chaque comparaison.
L’algorithme de Hörner évalue un polynôme avec n+1n+1 multiplications.
La recherche dichotomique compare la cible à l’élément d’indice m=⌊(g+d)/2⌋m=\lfloor(g+d)/2\rfloor.
La méthode naïve évalue un polynôme avec 2(n+1)2(n+1) multiplications.

L’algorithme de Hörner évalue un polynôme avec $$n+1$$ multiplications. · La recherche dichotomique compare la cible à l’élément d’indice $$m=\lfloor(g+d)/2\rfloor$$.

Explication

L’algorithme de Hörner réalise exactement n+1n+1 multiplications. La recherche dichotomique conserve une tranche contenant la cible et compare celle-ci à l’élément médian ; les deux autres affirmations confondent les coûts des méthodes d’évaluation.

38. À propos des méthodes d’évaluation polynomiale et de recherche dichotomique :

La recherche dichotomique maintient une tranche g≤k<dg\leq k<d.
L’évaluation progressive utilise 2(n+1)2(n+1) multiplications.
La méthode naïve utilise (n+1)(n+2)2\frac{(n+1)(n+2)}{2} multiplications.
La recherche dichotomique compare chaque élément de la liste à la cible.
L’algorithme de Hörner utilise n+1n+1 multiplications.

La recherche dichotomique maintient une tranche $$g\leq k<d$$. · L’évaluation progressive utilise $$2(n+1)$$ multiplications. · La méthode naïve utilise $$\frac{(n+1)(n+2)}{2}$$ multiplications. · L’algorithme de Hörner utilise $$n+1$$ multiplications.

Explication

La méthode naïve recalcule les puissances et demande (n+1)(n+2)2\frac{(n+1)(n+2)}{2} multiplications. L’évaluation progressive demande 2(n+1)2(n+1) multiplications, tandis que Hörner en demande n+1n+1 ; la recherche dichotomique utilise une tranche et non toute la liste à chaque étape.

39. Parmi les propositions suivantes concernant le tri par sélection, la(les)quelle(s) est(sont) exacte(s) ?

Il effectue exactement n(n−1)2\frac{n(n-1)}{2} comparaisons.
Son nombre de comparaisons dépend de l’ordre initial.
Il effectue exactement n−1n-1 échanges.
Son nombre de comparaisons reste indépendant de l’ordre initial.
Il effectue exactement nn échanges.

Il effectue exactement $$\frac{n(n-1)}{2}$$ comparaisons. · Il effectue exactement $$n-1$$ échanges. · Son nombre de comparaisons reste indépendant de l’ordre initial.

Explication

Le tri par sélection effectue exactement n(n−1)2\frac{n(n-1)}{2} comparaisons et n−1n-1 échanges. Ces comparaisons ne dépendent pas de l’ordre initial ; les bornes données pour le tri par insertion concernent une autre méthode.

40. Une liste est triée par insertion. Quelles sont les réponses exactes concernant le nombre de comparaisons ?

Une liste déjà triée entraîne exactement n−1n-1 comparaisons.
Une liste déjà triée entraîne exactement nn comparaisons.
Une liste décroissante entraîne exactement n(n−1)2\frac{n(n-1)}{2} comparaisons.
Le nombre de comparaisons est indépendant de l’ordre initial.
Le nombre de comparaisons est au plus n(n−1)2\frac{n(n-1)}{2}.

Une liste déjà triée entraîne exactement $$n-1$$ comparaisons. · Une liste décroissante entraîne exactement $$\frac{n(n-1)}{2}$$ comparaisons. · Le nombre de comparaisons est au plus $$\frac{n(n-1)}{2}$$.

Explication

Le tri par insertion effectue au plus n(n−1)2\frac{n(n-1)}{2} comparaisons. Il en effectue exactement n−1n-1 sur une liste déjà triée et exactement n(n−1)2\frac{n(n-1)}{2} sur une liste décroissante ; son coût dépend donc de l’ordre initial.

41. Concernant les structures séquentielles et les graphes, cochez la (les) proposition(s) exacte(s) :

Une pile dépile en premier le dernier élément empilé.
Un graphe non orienté contient des arêtes orientées entre ses sommets.
Un dictionnaire associe des clés deux à deux distinctes à des valeurs.
Une file défile en premier le dernier élément enfilé.
Une file suit le principe FIFO.

Une pile dépile en premier le dernier élément empilé. · Un dictionnaire associe des clés deux à deux distinctes à des valeurs. · Une file suit le principe FIFO.

Explication

Une pile applique LIFO, tandis qu’une file applique FIFO. Un dictionnaire est indexé par des clés distinctes, et un graphe non orienté utilise des arêtes entre sommets sans orientation ; les autres affirmations inversent ou déforment ces définitions.

42. À propos des dictionnaires Python et des graphes non orientés, quelles sont les réponses exactes ?

Un graphe non orienté contient des paires de sommets identiques comme arêtes.
Un dictionnaire permet d’accéder aux valeurs par leurs clés.
Un dictionnaire accède aux valeurs par des indices positionnels.
Un graphe non orienté s’écrit comme G={S,A}G=\{S,A\}.
Les clés d’un dictionnaire sont deux à deux distinctes.

Un dictionnaire permet d’accéder aux valeurs par leurs clés. · Les clés d’un dictionnaire sont deux à deux distinctes.

Explication

Un dictionnaire associe des clés distinctes à des valeurs et permet l’accès par clé. Il ne repose pas sur des indices comme une séquence, et un graphe non orienté est défini par un ensemble de sommets et un ensemble de paires de sommets distincts.

43. Concernant les graphes non orientés, cochez la (les) proposition(s) exacte(s) :

Un chemin de longueur nn contient n+1n+1 sommets.
Chaque paire successive d’un chemin forme une arête du graphe.
La longueur d’un chemin compte les sommets distincts rencontrés.
Un chemin de longueur nn contient n−1n-1 sommets.
L’arête {x,y}\{x,y\} permet de passer de xx vers yy et inversement.

Un chemin de longueur $$n$$ contient $$n+1$$ sommets. · Chaque paire successive d’un chemin forme une arête du graphe. · L’arête $$\{x,y\}$$ permet de passer de $$x$$ vers $$y$$ et inversement.

Explication

Dans un graphe non orienté, {x,y}\{x,y\} permet le passage dans les deux sens. Un chemin de longueur nn contient n+1n+1 sommets et chaque paire successive forme une arête ; sa longueur compte donc les arêtes parcourues.

Révisez avec les flashcards

Mémorisez les réponses avec 83 flashcards sur Algorithmique et bases de Python.

Qu'est-ce qu'un algorithme ?

Un procédé automatique transformant une information symbolique d'entrée en sortie par un nombre fini d'opérations.

Quelle condition doit respecter un algorithme exécutable ?

Il doit comporter un nombre fini d'opérations élémentaires.

Pourquoi un procédé infini ne peut-il pas être exécuté par un ordinateur ?

Parce qu'il comporte une quantité infinie d'opérations.

Voir les flashcards →

Approfondir avec la fiche

Consultez la fiche de révision complète sur Algorithmique et bases de Python.

Voir la fiche →

Cours similaires

Crée tes propres QCM

Importe ton cours et l'IA génère des QCM avec corrections en 30 secondes.

Générateur de QCM