Cuestionario: Introduction à la programmation et récursivité — 16 preguntas

Preguntas y respuestas detalladas

1. Quelle personnalité est associée aux premiers diagrammes souvent considérés comme des programmes pour une machine mécanique ?

John McCarthy
Ada Lovelace
Grace Hopper
Alain Turing

Ada Lovelace

Explicación

Ada Lovelace est associée aux diagrammes de 1842 pour la machine de Babbage, souvent vus comme les premiers programmes informatiques. Grace Hopper et John McCarthy sont liés à d’autres avancées plus tardives.

2. Quel événement est lié à la popularisation du terme « bug » en informatique ?

La formalisation du concept de programme
La création de Lisp
Une panne due à une mite dans une lampe
L’invention du premier compilateur

Une panne due à une mite dans une lampe

Explicación

Le terme « bug » est popularisé en 1945 après une panne attribuée à une mite dans une lampe. Les autres propositions renvoient à d’autres jalons de l’histoire de la programmation.

3. Comment un langage compilé est-il traité avant son exécution par la machine ?

Son code source est traduit en code binaire exécutable
Son code source est converti en texte HTML
Son code source est stocké sans transformation préalable
Son code source est exécuté ligne par ligne par un interpréteur

Son code source est traduit en code binaire exécutable

Explicación

Un langage compilé est traduit par un compilateur en code binaire exécutable. L’exécution ligne par ligne correspond aux langages interprétés.

4. Quel ensemble contient uniquement des langages cités comme semi-interprétés ?

Lisp, Java, C#
Fortran, Cobol, Pascal
Prolog, HTML, Ada
Python, XML, JavaScript

Lisp, Java, C#

Explicación

Lisp, Java et C# sont donnés comme exemples de langages semi-interprétés. Fortran et Cobol sont compilés, tandis que Python, XML et JavaScript sont interprétés.

5. Dans une fonction Python, quelle affirmation décrit correctement une variable locale ?

Elle n’est utilisable qu’à l’intérieur de la fonction où elle est définie
Elle doit être déclarée avec le mot-clé global pour exister
Elle est accessible partout dans le programme sans restriction
Elle est toujours visible depuis toutes les autres fonctions

Elle n’est utilisable qu’à l’intérieur de la fonction où elle est définie

Explicación

Une variable locale n’existe et ne s’utilise qu’à l’intérieur de la fonction qui la définit. Le mot-clé global concerne au contraire les variables globales.

6. Que renvoie l’expression liste[2:4] en Python ?

Tous les éléments sauf le dernier
Les deux premiers éléments de la liste
Les éléments d’indices 2 inclus à 4 exclus
Les éléments d’indices 2 exclus à 4 inclus

Les éléments d’indices 2 inclus à 4 exclus

Explicación

Le slicing en Python utilise une borne de début incluse et une borne de fin exclue, donc liste[2:4] prend les éléments d’indices 2 et 3. L’option sur tous les éléments sauf le dernier correspond plutôt à liste[:-1].

7. À quoi sert principalement une assertion en Python ?

À importer automatiquement un module
À vérifier une condition attendue et arrêter l’exécution si elle est fausse
À gérer une exception sans interrompre le programme
À documenter le rôle d’une fonction

À vérifier une condition attendue et arrêter l’exécution si elle est fausse

Explicación

Une assertion contrôle une condition attendue ; si elle échoue, Python lève une AssertionError et stoppe l’exécution. La gestion d’exception relève plutôt de try/except.

8. Pourquoi les tests unitaires sont-ils utiles lors de la mise au point d’un programme ?

Ils garantissent qu’aucune exception ne pourra se produire
Ils vérifient séparément chaque fonction pour repérer rapidement les défauts localement
Ils ne servent qu’à vérifier l’affichage final du programme
Ils remplacent tous les autres types de tests

Ils vérifient séparément chaque fonction pour repérer rapidement les défauts localement

Explicación

Les tests unitaires isolent chaque fonction ou partie du programme, ce qui permet de localiser vite les erreurs. Ils ne remplacent pas les tests d’intégration ni les tests complets.

9. Qu’est-ce que la modularité dans un programme ?

Le découpage du programme en composants indépendants réutilisables et plus faciles à modifier
L’utilisation obligatoire d’une seule fonction par programme
Le fait d’écrire tout le code dans un seul fichier
L’exécution automatique de toutes les fonctions d’un module

Le découpage du programme en composants indépendants réutilisables et plus faciles à modifier

Explicación

La modularité consiste à découper un programme en composants indépendants pour faciliter la réutilisation et la maintenance. Elle favorise donc l’organisation du code plutôt que sa concentration dans un seul bloc.

10. Que se passe-t-il avec le bloc if __name__ == "__main__": lorsqu’un fichier Python est importé ?

Le bloc ne s’exécute pas, il s’exécute seulement si le fichier est lancé comme script
Le bloc ne peut apparaître que dans une bibliothèque externe
Le bloc remplace l’instruction import
Le bloc s’exécute automatiquement dans tous les cas

Le bloc ne s’exécute pas, il s’exécute seulement si le fichier est lancé comme script

Explicación

La condition __name__ == '__main__' est vraie seulement lors d’un lancement direct du fichier comme script. Lors d’un import, le bloc correspondant n’est pas exécuté.

11. Dans une fonction récursive, quel élément permet d’éviter une récursion infinie en donnant un résultat direct dans un cas simple ?

Un cas de base
Un module importé
Une assertion Python
Une variable globale

Un cas de base

Explicación

Un cas de base traite une situation simple sans nouvel appel récursif, ce qui permet à la fonction de s’arrêter. Sans ce cas, les appels peuvent se répéter indéfiniment.

12. Que se passe-t-il lors des appels récursifs successifs dans la pile d’exécution ?

Les appels récursifs sont exécutés en parallèle dans la mémoire
La pile efface tous les contextes dès qu’un appel récursif commence
Chaque appel remplace immédiatement le précédent sans empilement
Chaque appel ajoute un nouveau contexte, puis les contextes sont dépilés en sens inverse

Chaque appel ajoute un nouveau contexte, puis les contextes sont dépilés en sens inverse

Explicación

Chaque appel récursif empile un nouveau contexte dans la pile d’exécution. Quand le cas d’arrêt est atteint, les contextes sont retirés dans l’ordre inverse, selon le principe LIFO.

13. Quelle est la définition correcte d’un variant de boucle ?

Une condition qui stoppe automatiquement toute boucle
Une propriété vraie au début et à la fin de chaque itération
Une valeur quelconque choisie au hasard pour tester la boucle
Une quantité entière qui décroît strictement et reste positive ou nulle pendant l’exécution

Une quantité entière qui décroît strictement et reste positive ou nulle pendant l’exécution

Explicación

Un variant de boucle est une quantité entière qui diminue strictement à chaque itération tout en restant positive ou nulle. C’est cette décroissance qui sert à démontrer la terminaison d’une boucle while.

14. Pour établir la correction partielle d’une fonction récursive, quel type de raisonnement utilise-t-on ?

Un test d’égalité entre le résultat et une chaîne de caractères
Une vérification que le programme compile sans erreur
Un raisonnement de type récurrence avec P(0) puis P(n) ⇒ P(n+1)
Un calcul de la profondeur maximale de la pile d’exécution

Un raisonnement de type récurrence avec P(0) puis P(n) ⇒ P(n+1)

Explicación

La correction partielle d’une fonction récursive se démontre comme une récurrence mathématique : on prouve une base puis l’hérédité. L’idée est que si la propriété est vraie au départ, elle reste vraie d’un appel au suivant.

15. Comment prouve-t-on la terminaison d’une fonction récursive ?

En prouvant que tous les appels récursifs ont exactement la même forme
En montrant l’existence d’un cas de base et que les appels s’en rapprochent
En comparant le résultat à celui d’une fonction non récursive
En vérifiant seulement que la fonction renvoie une valeur numérique

En montrant l’existence d’un cas de base et que les appels s’en rapprochent

Explicación

La terminaison se démontre en exhibant un cas de base et en montrant que chaque appel récursif progresse vers ce cas d’arrêt. Ainsi, la récursion ne peut pas se poursuivre indéfiniment.

16. Pour la factorielle récursive, quelle propriété sert d’invariant dans la preuve de correction partielle ?

factorielle_recursive(i) = i !
factorielle_recursive(i) = i + 1
factorielle_recursive(i) = 2 × i
factorielle_recursive(i) = i − 1

factorielle_recursive(i) = i !

Explicación

L’invariant choisi est bien que la fonction renvoie la factorielle de son argument, soit factorielle_recursive(i) = i !. La preuve s’appuie ensuite sur le fait que (n+1)! = (n+1) × n! pour passer de P(n) à P(n+1).

Repasa con tarjetas de memoria

Memoriza las respuestas con 16 tarjetas de memoria sobre Introduction à la programmation et récursivité.

Histoire de la programmation — début ?

Premiers programmes avec Ada Lovelace en 1842.

Langages compilés — rôle ?

Traduire le code source en code binaire exécutable.

Variables locales — localisation ?

À l’intérieur d’une fonction.

Ver tarjetas de memoria →

Estudia la hoja de repaso

Lee la hoja de repaso completa sobre Introduction à la programmation et récursivité.

Ver hoja de repaso →

Similar courses

Crea tus propios cuestionarios

Importa tu curso y la IA genera cuestionarios con correcciones en 30 segundos.

Generador de cuestionarios