TNSI: Exercices sur la Récursivité⚓︎
Nombres⚓︎
Écrire une fonction récursive f(n:int)->int
qui accepte en argument un entier \(n\) et qui renvoie l'entier qui est le produit: \(1\times 2\times 3\times ...\times n\)
c'est à dire le produit de tous les nombres entiers inférieurs ou égaux à \(n\) (jusqu'à/en commençant par \(1\))
fonctions Pair() et Impair()
-
- vrai si \(n\) est pair
- faux si \(n\) est impair
Écrire une fonction récursive
pair(n:int)->bool
qui renvoie :Corr
1 2 3 4 5 6 7
def pair(n:int)->bool: if n == 0: # (1) return True elif n == 1: # (2) return False else: # (3) return pair(n-2)
- 1er cas de base
- 2ème cas de base
- Appel Récursif
-
Écrire une fonction récursive
impair(n:int)->bool
qui renvoie :- vrai si \(n\) est impair
- faux si \(n\) est pair
Corr
1 2 3 4 5 6 7
def impair(n:int)->bool: if n == 0: # (1) return False elif n == 1: # (2) return True else: # (3) return impair(n-2)
- 1er cas de base
- 2ème cas de base
- Appel Récursif
fonctions pair() et impair() imbriquées
Écrire deux fonctions récursives imbriquées, pair(n:int)->bool
et impair(n:int)->bool
de sorte qu'elles soient définies l'une par rapport à l'autre de manière récursive:
pair(n)
est vrai siimpair(n-1)
est vrai- Et réciproquement :
impair(n)
est vrai sipair(n-1)
est vrai pair(0)
est vraiimpair(1)
est vrai
Corr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
- 1er cas de base de la fonction
pair
- 2ème cas de base de la fonction
pair
- La fonction
pair
(d'argument n) appelle récursivement la fonctionimpair
(d'argument n-1) - 1er cas de base de la fonction
impair
- 2ème cas de base de la fonction
impair
- La fonction
impair
(d'argument n) appelle récursivement la fonctionpair
(d'argument n-1)
Nombres Romains
La page wikipedia suivante résume ce qu'il faut savoir sur la numération romaine (wikipedia)
Romain \(\Rightarrow\) Indien On se donne le dictionnaire suivant:
ROMAIN = { 'M' : 1000,
'D' : 500,
'C' : 100,
'L' : 50,
'X' : 10,
'V' : 5,
'I' : 1}
Écrire une fonction récursive romain_vers_indien(s:str)->int
qui prend en paramètre une chaîne de caractères s
représentant un nombre romain sous forme de chaîne, et dont le résultat est l’entier correspondant écrit dans la notation décimale positionnelle usuelle, dite écriture indienne.
Ex: Pour s="MMXXI"
, romain_vers_indien('MMXXI')
renvoie 2021
Corr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
|
- Réciproquement
Indien \(\Rightarrow\) Romain
Écrire une fonction récursive indien_vers_romain(n:int)->str
qui prend en paramètre un nombre n
représentant un nombre entier sous forme indienne, et qui renvoie en sortie la chaîne de caractères représentant son écriture en nombre romains.
Ex: Pour n=2021
, indien_vers_romain(2021)
renvoie MMXXI
Corr
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
|
Représentation Binaire Récursive
- Écrire une fonction récursive
dec2bin(n:int)->list
qui renvoie la représentation binaire d’un nombren
sous forme d'une liste.
Par ex:dec2bin(5)
renvoie[1,0,1]
- Écrire la "même" fonction récursive, mais qui renvoie une chaîne de caractère (au lieu d'une liste).
Par ex:dec2bin(5)
renvoie'101'
- Écrire une fonction récursive
bin2dec(l:list)->int
qui accepte en entrée une listel
représentant le nombre binaire, et qui renvoie en sortie l'entier correspondant à conversion del
en nombre décimal.
Par ex:bin2dec([1,0,1])
renvoie la chaîne5
- Écrire une fonction récursive
hexa2bin(list)->list
qui renvoie la représenation binaire d'un nombre hexadécimal (donné sous forme destr
), sous forme de liste.
Par ex:hexa2bin(['A','3','F'])
renvoie[1,0,1,0,0,0,1,1,1,1,1,1]
- Écrire une fonction récursive
bin2hexa(l:list)->list
qui accepte en entrée une listel
représentant le nombre binaire, et qui renvoie en sorte l'écriture en hexadécimal (del
) sous forme d'une liste, correspondant à conversion del
en nombre décimal.
Par ex:bin2hexa([1,0,1,1,0,1,1,0,1,1])
renvoie['2','D','B']
Transformer la fonction itérative somme
suivante en une fonction récursive:
def somme(l:list)->float:
s = 0
for valeur in l:
s += valeur
return s
Que fait l'algorithme récursif suivant? donné en pseudo-code ..
fonction f(n):
SI n=1 ALORS
renvoie 0
SINON
renvoie 1+f(n//2)
FINSI
Que fait l'algorithme récursif suivant? donné en pseudo-code ..
fonction f(n):
SI n=0 ALORS
renvoie f(n//2)
SINON
renvoie n%2
Dans cet exercice, on suppose connu, et on pourra utiliser, le principe de la recherche dichotomique d'un nombre
1. Par compréhension de liste, créer un tableau T
(une liste Python) contenant 10 nombres entiers aléatoires entre 1 et 50
2. Écrire une fonction récursive maxi(T:list)->int
qui détermine le maximum d'un Tableau T (une liste Python) de nombres entiers.
3. Écrire une fonction récursive mini(T:list)->int
qui détermine le maximum d'un Tableau T (une liste Python) de nombres entiers.
Chaînes de caractères⚓︎
Soit s
une chaine de caractères, écrire un algorithme récursif permettant de déterminer sa longueur.
Soit phrase
une chaîne de caractère.
Proposer une fonction récursive inverse(phrase:str)->str
qui accepte en entrée une chaîne phrase
en argument, et qui renvoie en sortie une chaîne inversée.
Exemple : allo
devient olla
On appelle permutation d’une chaîne de caractères s
toute chaîne de même longueur que s
contenant les mêmes caractères que s
. Par exemple, la chaîne 'eadbc' est une permutation de la chaîne 'abcde'.
Écrire une fonction récursive qui construit la liste de toutes les permutations possibles d’une chaîne s
NB il sera probablement nécessaire de définir des fonctions auxiliaires, on essaiera de les coder récursivement aussi.
Des Tours Empilées
On dispose de \(n\) disques de couleurs, de diamètres distincts, et de 3 tours notées \(A\), \(B\) et \(C\).
Tous les disques doivent être placés sur la Tour C, dans l'ordre décroissant
- On ne peut déplacer qu'un seul disque à la fois (d'une tour vers une autre)
- On NE PEUT PAS déposer un disque plus grand sur un disque plus petit.
1. Proposer un algorithme, qui demande en entrée le nombre \(n\) de disques à déplacer de "A" vers "C", et une fonction récursive résolvant le problème des Tours Empilées, c'est-à-dire qui détaille chacun des déplacements entre les tours (du disque supérieur de chaque tour), pour parvenir jusqu'à la Position Finale.
Exemple de Syntaxe attendue:
A --> C
A --> B
C --> B
etc...
Questions Diverses
Que dire de ces sigles ?
- VISA : VISA International Service Association
- GNU : GNU is Not Unix
- WINE : Wine Is Not an Emulator