Exercice 1 · Bac Numérique et Sciences Informatiques Polynésie 2022 (jour 1)

Thème : Récursivité · Tiré du sujet Jour 1 (2022)

Énoncé

EXERCICE 1 (4 points)

Cet exercice traite du thème «programmation», et principalement de la récursivité.

On rappelle qu'une chaîne de caractères peut être représentée en Python par un texte entre guillemets "" et que:

la fonction len renvoie la longueur de la chaîne de caractères passée en paramètre;

si une variable ch désigne une chaîne de caractères, alors ch[0] renvoie son premier caractère, ch[1] le deuxième, etc.;

l'opérateur + permet de concaténer deux chaînes de caractères.

Exemples:

>>> texte = "bricot"

>>> len(texte)

6

>>> texte[0]

"b"

>>> texte[1]

"r"

>>> "a" + texte

"abricot"

On s'intéresse dans cet exercice à la construction de chaînes de caractères suivant certaines règles de construction.

Règle A: une chaîne est construite suivant la règle A dans les deux cas suivants:

soit elle est égale à "a";

soit elle est de la forme "a"+chaine+"a", où chaine est une chaîne de caractères construite suivant la règle A.

Règle B: une chaîne est construite suivant la règle B dans les deux cas suivants:

soit elle est de la forme "b"+chaine+"b", où chaine est une chaîne de caractères construite suivant la règle A;

soit elle est de la forme "b"+chaine+"b", où chaine est une chaîne de caractères construite suivant la règle B.

On a reproduit ci-dessous l'aide de la fonction choice du module random.

>>>from random import choice

>>>help(choice)

Help on method choice in module random:

choice(seq) method of random.Random instance

Choose a random element from a non-empty sequence.

La fonction A() ci-dessous renvoie une chaîne de caractères construite suivant la règle A, en choisissant aléatoirement entre les deux cas de figure de cette règle.

def A():

if choice([True, False]):

return "a"

else:

return "a" + A() + "a"

1. a.

Cette fonction est-elle récursive ? Justifier.

1. b.

La fonction choice([True, False]) peut renvoyer False un très grand nombre de fois consécutives. Expliquer pourquoi ce cas de figure amènerait à une erreur d'exécution.

Dans la suite, on considère une deuxième version de la fonction A. À présent, la fonction prend en paramètre un entier nn tel que, si la valeur de nn est négative ou nulle, la fonction renvoie "a". Si la valeur de nn est strictement positive, elle renvoie une chaîne de caractères construite suivant la règle A avec un nn décrémenté de 1, en choisissant aléatoirement entre les deux cas de figure de cette règle.

def A(n):

if... or choice([True, False]):

return "a"

else:

return "a" +... + "a"

2. a.

Recopier et compléter aux emplacements des points de suspension... le code de cette nouvelle fonction A.

2. b.

Justifier le fait qu'un appel de la forme A(n) avec nn un nombre entier positif inférieur à 50, termine toujours.

On donne ci-après le code de la fonction récursive B qui prend en paramètre un entier nn et qui renvoie une chaîne de caractères construite suivant la règle B.

def B(n):

if n <= 0 or choice([True, False]):

return "b" + A(n-1) + "b"

else:

return "b" + B(n-1) + "b"

On admet que:

les appels A(-1) et A(0) renvoient la chaîne "a";

l'appel A(1) renvoie la chaîne "a" ou la chaîne "aaa";

l'appel A(2) renvoie la chaîne "a", la chaîne "aaa" ou la chaîne "aaaaa".

3.

Donner toutes les chaînes possibles renvoyées par les appels B(0), B(1) et B(2). (Séparez les chaînes par des virgules si plusieurs sont possibles).

On suppose maintenant qu'on dispose d'une fonction raccourcir qui prend comme paramètre une chaîne de caractères de longueur supérieure ou égale à 2, et renvoie la chaîne de caractères obtenue à partir de la chaîne initiale en lui ôtant le premier et le dernier caractère.

Par exemple:

>>> raccourcir("abricot")

"brico"

>>> raccourcir("ab")

""

4. a.

Recopier et compléter les points de suspension... du code de la fonction regleA ci-dessous pour qu'elle renvoie True si la chaîne passée en paramètre est construite suivant la règle A, et False sinon.

def regleA(chaine):

n = len(chaine)

if n >= 2:

return chaine[0] == "a" and chaine[n-1] == "a" and \

regleA(...)

else:

return chaine ==...

4. b.

Écrire le code d'une fonction regleB, prenant en paramètre une chaîne de caractères et renvoyant True si la chaîne est construite suivant la règle B, et False sinon.

Énoncé: Exercice 1 · Bac Numérique et Sciences Informatiques Polynésie 2022 (jour 1)

Corrigé

Corrigé proposé par AprenAI (non officiel)

1. a. Cette fonction est-elle récursive ? Justifier.

Réponse : Oui, cette fonction est récursive car elle s'appelle elle-même dans son corps (ligne : return "a" + A() + "a").

1. b. La fonction choice([True, False]) peut renvoyer False un très grand nombre de fois consécutives. Expliquer pourquoi ce cas de figure amènerait à une erreur d'exécution.

Réponse : Si choice renvoie continuellement False, les appels récursifs s'enchaînent sans jamais atteindre le cas de base (return "a"). Cela provoque un dépassement de la capacité de la pile d'appels récursifs (RecursionError en Python).

2. a. Premier emplacement : condition d'arrêt portant sur n

Réponse : n <= 0

2. a. Deuxième emplacement : appel récursif

Réponse : A(n - 1)

2. b. Justifier le fait qu'un appel de la forme A(n) avec n un nombre entier positif inférieur à 50, termine toujours.

Réponse : À chaque appel récursif dans la branche else, le paramètre nn est un entier strictement décroissant (n−1n-1). La suite des valeurs prises par nn forme un variant de boucle/terminaison qui atteint nécessairement la valeur 0 au bout d'au plus nn étapes (ici au plus 50 étapes). Dès que n≤0n \le 0, la condition est vraie et la fonction s'arrête sans appel récursif. La fonction termine donc toujours.

3. Chaînes possibles pour B(0)

Réponse : "bab"

Les réponses des 5 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium

Résous-le ici : correction automatique, indices et corrigé détaillé.

‹ Exercice 2 · Polynésie 2024 (jour 1)

Plus d’exercices de Récursivité