Vous êtes sur la page 1sur 30

n*ieur de sdenoes

InAt1R
apfAtuécs et de de AIM)AITUNIOUB a STRUCI'URBS
DB DONNÉES Section : ml
Enseignantes : A.
TDI
(RÉCURSIVITÉ)

Exe i 1

Ecrire une procédure récursive permettant d'inverser les éléments d'un tableau T de N
caractères.L'inversion doit êÙe effectuéede sorte à avoir le caractèrede la premièrecase
dans la demière et inversement.
Exemple
:
Tableau avant l'appel de la procédure :

Tableau après l'appel de la procédure : f e d c b a

Exercice

Fonction Truc (n : Entier) : Entier


Début
X : Entier
Si (n<lO) alors retourner (n an)
Sinon X n mod 10
Retoumer (X*X+ Truc (n div 10))
Fin si
Fin

1. Que fait la fonction Truc ?


2. Quelle est la nature de la récursivité.

Exercice 3

Pour convertir un nombre entier positif N de la base décimale à la base binaire, il faut opérer
par des divisions successives du nombre N par 2. Les restes des divisions constituent la
représentation binaire. Exemple binaire(13)=1101.

Ecrire une procedure récursive « Binaire » permettant d'aficher la représentaüon binaire d'un
nombre N.

Exercice 4

Soit un tableau T de N entiers trié dans l'ordre croissant.

a. Ecrire une fonction récursive permettant de vérifier qu'un tableau T est Ù•iéou non
b. Ecrire une procédure permettant d'insérer un entier E dans un tableau T.

2023/2024
Excrciçç 4

La suite de Fibonacci est définie par fo —fi I et pour tout naturel n >2 par :

fn fn—l+ fn—2

1. Écrire une fonction récursivef(n) calculant le terme d'indice "n" de cette suite.
2. Combien d'appels à la fonction 'T' sont-ils faits pour calculerf (5) ?
3. Écrire une version récursive du calcul de f (n) ne nécessitant qu'au plus "n" appels à
elle-même pour calculerf (n) (pour n >2).

Exercice 5

Dans cet exercice, les fonctions/procédures à écrire doivent être récursives.


1. Ecrire un algorithme Appartenance(T,x) qui recherche si un élément "x" appartient au
"T". Etudiez les cas où le tableau est trié ou non. Si "x" appartient effectivement
à "T", l'algorithme renverra Vrai, et Fat" sinon.
2. Ecrire un algorithme Union(T1, T2) qui nous renvoie l'union des deux tableaux "T l" et
"T2" qui lui sont passés en argument. Etudiez les cas où le tableau est trié ou non.

3. Ecrire un algorithme Intersection(Tl, T2) qui nous renvoie l'intersection des deux
tableaux qui lui sont passés en argument. Etudiez les cas où le tableau est trié ou non.
Exercice 6

Soit une image binaire représentée dans une matrice à 2 dimensions. Les éléments m[iJ] sont
dits pixels et sont égaux soit à Osoit à l. Chaque groupement de pixels égaux à I et connectés
entre eux forment une composante connexe (figure). L'objectif est de donner une valeur
différente de I à chaque composante (2 puis 3 puis 4 etc.).

l. Ecrire une fonction récursive propager permettant de partir d'un point (iJ) situé à
l'intérieur d'une composante connexe et de propager une éüquette T à tous les pixels
situés à l'intérieur de la composante.
2. Ecrire une fonction étiqueter permettant d'affecter une étiquette différente à chaque
composante connexe.

2023/2024
Exçrciçç 7

Il y a n oranges dans la cuisine et vous avez décidé de manger quelques-unesde ces oranges
tous les jours comme suit :
• Mangez une orange.
• Si le nombre d'oranges restantes n est divisible par 2 alors vous pouvez manger n/2
oranges.
• Si le nombre d'oranges restantes n est divisible par 3 alors vous pouvez manger
2*(n/3) oranges.

Vous ne pouvez choisir qu'une seule des actions par jour.


Étant donné l'entier n, renvoie le nombre minimum de jours pour manger n oranges.
Exemple : Pour n = 10, il faut 4 jours
Explication : Vous avez 10 oranges.
1. Jour I : Mangez 1 orange, 10—1 = 9.
2. Jour 2 : Mange 6 oranges, 9 —2*(9/3) = 9 —6 = 3. (Puisque 9 est divisible par 3)
3. Jour 3 : Mange 2 oranges, 3 —2*(3/3) 3 2
4. Jour 4 : Mangez la dernière orange I —I = O.
n faut au moins 4 jours pour manger les 10 oranges.

Ecrire une fonction de type diviser pour régner qui permet de calculer la somme des
éléments d'un tableau.

Exercice 9

Etant donné un tableau trié d'entiers A[s..n et deux entiers a et b tel que a<= b. on cherche s'il
existe un élément du tableau vérifiant (s'il y en a plusieurstrouvez un). Si la
valeur n'existe pas la fonction retourne -l.

Exemple: soit le tableau AC et les bomes a=40, b=50. Dans ce cas, la


valeur encadré existe : c'est

Donner une fonction de type diviser pour régner qui résout ce problème.

2023/2024 3/3
Jon 0 · c89.

N
3K3

00

7
z0 -L—O
TD


D -

( D

いンめ

い ソ良)

島良 =ら。
C。 も
と(心人
い)

0
い) ユい )
(a)

00

0

4

x Z

3) ' 00

3
de de ALGORITHMIQUE
& STRUCTURES
DE DONNÉES Section ; FIAI
FAseimantcs : A.
TD2

(USTO CHAINÉES)

L'objectif de ce problème est de proposer un ensemble de modules permettant la de


stock de médicaments (ftlne pharmacie. On vous propose de représenter ces données sous
frrme de liste linéaire simplement chaînée.
Un médicament est caractérisé par:
• Son code, exemple 4L276A (doit êfre unique)
• Son nom, exemple aspegic1000
• Sa quantité (en boites), exemple 200 boites
• Son prix d'achat, exemple 1.980
1. Donner les structures de données à la représentation de ce stock.
2. Ecrire une fonction Rechercher (L, Med) qui cherche un médicament « Med » dans
une liste et retourne son adresse mémoire retrouvée sinon NIL.
3. Ecrire la procédure Vendre (L : Liste, Med : Médicament, NbBoites: entier)
permettant de retirer, si possible, « NbBoites » du stock associé au médicament « Med »
de la liste L.
4. Ecrire la procédureAcheter (L : Liste, Med : Médicament,NbBoites : entier , P :
réel) permettant au phannacien d'alimenter son stock par « NbBoites » du médicament
« Med ». On considère qu'un médicament prenne toujours le nouveau prix d'achat P.
5. Ecrire la fonction Valeur-Stock permettant de calculer la valeur totale des
médicaments dans le stock.
Dans la suite, supposons que nous traitons une liste doublement chainée (LDC) de
médicaments. Nous avons enrichi la structure Médicament par deux nouveaux champs:
• la date de fabrication DF, exemple 20/02/2023
• la date d'expiration DE, exemple 19/02/2025
6. Déclarer les structures de données nécessaire au traitement d'une liste LDC de
médicaments.
7. Ecrire un module qui, permet de supprimer tous les médicaments périmés du stock.

Exercice 2

On dispose d'un tableau de listes linéaires chaînées. Chaque case du tableau contient un entier
qui représente une longueur de chaine et un pointeur vers la liste des mots de même longueurs
à raison d'un mot par maillon.

2023/2024 1/3
Al•nrnhm•
6

l. Définir les structures de données.


écrire la fonction Rech (T :Tab ,
2. On suppose que le tableau de liste des mots est créé,
le tableau de Liste. On
mot :chaine): booléen qui vérifie l'existence d'un mot dans
longueur de la chaine
utilise la fonction: Longueur (str : chaine) : ender qui calcul la
sfr.
liste.
3. Ecrirc une procédure qui permet d'insérer un mot dans le tableau de

Ex ce

Les creuses sont des matrices d'entiers comprenant une majorité de O comme dans
l'exemple suivant :

o 2 o o o
1 3 o o
M-
o O o o o
o o O 6

Par souci d'économie, une matrice creuse peut être représentée par une liste chainée simple
contenant uniquement les éléments non nuls avec leurs indices. Ainsi, la maù-ice M peut être
représentée par la liste suivante : M = [(2, (1,2)) ; (l, (2,1)) ; (3, (2,3)) ; (6, (4,4))].

Les éléments sont rangés par indice croissant (ligne puis colonne). Polir connaître la
dimension de la matrice nous allons définir le Wpe MatriceCreuse comme suit :

1. Définir les types nécessaires.


2. Ecrire une procédure Créer_Matrice_Creuse (Tab: Tab2D, L,C: enüer, Var M:
MatriceCreuse) qui permet de créer à partir d'un tableau Tab à deux dimensions L et C
une liste chainée M contenant les valeurs non nulles du tableau Tab. Avec Tab2D =
Tableau [1..100,1..1001d'entiers.
3. Ecrire une fonction Nombre Non Nuls (M: MaÈiceCreuse): entier qui retourne le
nombre d'éléments non nuls dans une matrice creuse.

2023/2024 2/3
4. Ecrire une procédure Somme_Matrice_Creuse (Ml,M2: MatriceCreuse, Var M3:
MatriccCrcusc) qui permet de construirc unc matricc qui est la somme de deux
matrices creuses de même dimension. La somme de deux matrices Tl et T2 se fait par
la formule suivante :
5. Ecrire une procédure Ins_Ligne (Lig: TablD, C: entier, Var M: MatriceCreuse) qui
permet d'insérer une ligne dans une matrice creuse. Avec Lig un tableau à une
dimension de taille C.
6. Ecrirc une procédurc Affiche_Diag_Matrice (M: MatriceCreuse) qui permet d'affcher
les éléments non nuls de la diagonale d'une matrice creuse. Il faut vérifier si la matrice
est carrée ou non.

Exercice 4

Définition : une liste circulaire est une liste doublement chainée dont le nœud de la tête pointe
le dernier nœud et vis-versa.

Exemple : Ci-dessous un exemple d'une liste circulaireL :

Déclarations :
Nœud —Enregistrement
Val : Entier
suiv : î Nœud //Nœud suivant
prec : T Nœud //Nœud
précédent
FinEnreg
LC = Nœud //Liste circulaire
1. Ecrire une procédure Ajout_Queue_LCpermettant d'ajouter un entier E en queue
d'une liste circulaire L.
2. Ecrire une fonction Appartient LC permettant de chercher si une valeur E est présente
dans une liste circulaire L. En cas de présence de E, la fonction doit retourner l'adresse
du premier nœud le contenant, sinon, elle retournera Nil.
3. Ecrire une procédure Supprimer_val_LCpermettant de supprimer d'une liste circulaire
la première occurrence d'une valeur E.
4. Ecrire une procédure Vider LC permettant de libérer l'espace mémoire d'une liste

2023/2024 3/3
circulaire L.
0089 't

ΒααΔΙΙ 'ι
ΫΙ)ΙΥ

ΜΤΙλ
03 0 0
0 023

Ç.Jû,uoe
-
enşü

C QB.İ-A

3Jo.rvf(
•JOAYv

q 'JQ.L

S %101
k) Rahu.-

şw&q
。~ い丁。印H)

, S澱祕

0 0 ハ0 人0 0
0 0〇9 0 00 0 0
00 イ 0つ イ「0 0
0「
)
じ 30 の イ ら 新
9 こ
20
2
supérieur des sciences
et de teckmoloòede AUBORITUMIOUE & STRUCI'URES
DE DONNÉES Section : AAI

t Fanseignantcs: A. Naceur
N. Khiari
(PILES rr FILES)

Exerçice 1

Un problème fréquent d'un compilateuret des traitementsde textes est de déterminer si les
parenthèses d'une chaîne de caractères sont balancées et proprement incluses l'une dans l'une
Par exemple, la chaîne ((() ) ( ) ) ( ) est bien balancée et proprement écrite. Mais les chaînes )
( )( ou ( ) ) ne le sont pas.

Écrire un algorithme qui retourne Vrai si une chaîne de caractères est proprement écrite et
bien balancée, et Faux sinon. Utiliser pour cela une pile.

Exercice 2

Les notations préfixée (ou préfixe) et post-fixée (ou post-fixe) sont des formes d'écriture
d'expressions arithmétiques de façon non ambiguë sans utiliser les parenthèses. Ces notations
se distinguentpar la position relative que prennent les opérateurs et leurs opérandes. Un
opérateur est écrit avant ses opérandes en notation préfixée et après ses opérandes en notation
post-fixée.
Exemple : l'expression en notation infixée classique : (5 - 6) * 7 est écrite :
• En notation préfixée : * - 5 6 7
• En notation post-fixée : 5 6 - 7 *
Écrire un algorithme qui transforrneune expressioninfixée avec des parenthèsesen notation
postfixée.
Exemple : 3 * (((12 - 3) / 3) - l) doit-être convertie en : 3 12 3 —3 / I - *
L'algorithme doit ranger le résultat de la conversion dans une file avant de l'afficher. La file
doit contenir la liste des opérandes et des opérateurs séparés par un espace.
Exercice 3

On suppose que l'on a deux files d'entiers triées dans l'ordre croissant FI et F2. On a en plus
une troisième file F3 vide. On voudrait remplir F3 avec les entiers présents dans les deux
premières en faisant en sorte que F3 soit aussi triée dans l'ordre croissant. F3 est le résultat de
la fusion de FI avec F2.

Fik fl d'entiers
4 6 12 23 25
tète

naagazn
queue

1
Il faut que la fusion fonctionne avec toutes les files FI et F2 possibles et imaginables. Comme
d'habitude dans la manipulationdes files, on n'utilise que les primitives de manipulation
(ajouter en queue « Enfiler », retirer en tête « Défiler », lire « Tète », .. Ecrire la procédure
correspondante à cette fusion.

Exercice 4
On suppose que l'on a une file F. On veut
trouver une fonction récursive pour inverser
F. Le principe est le suivant : pour inverser F, Itfk
on suppose que l'on peut inverser la file au nu
commençant au deuxième élément. Il faut
alors posidonner l'élément de tête de file en
queue de file.
Exemple : Pour inverser F, on met 2 en
mémoire, et on inverse la file restante. Il
reste alors à ajouter 2 en queue de la file
restante inversée pour obtenir F inversée.
Ecrire ceüe fonction récursive (la fonction
doit fonctionner pour toutes les files
et vous ne devez utiliser que les
primiüves classiques sans manipuler les
pointeurs directement).

Exercice 5
Ecrire une procédure pemeüant de renverser chaque k éléments d'une file. Vous pouvez
utiliser au choix les primitives du type abstrait Pile et File.

Soit la file F suivante :

1 2 3 4 5 6 7 8 9 10
Si k= 3, la file F devient :
3 2 1 6 5 4 9 8 7 10
Si k= 4, la file F devient :
4 3 2 1 8 7 6 5 .10 9

2
Une Deque (double endcd queue ou unc filc
à deux bouts) possèdc à la fois les propriétés
d'une pile et d'une file. Unc Dequc est
définie par deux extrémités : tête ct qucuc.
On peut donc consulter, ajouter ou supprimer
un élément à chaquc extrémité dc la
su-ucture.
9n considèrc unc Dcquc commc une listc
chainée de caractères,
1. Ecrire les structures de données nécessaires pour définir une Deque.
2. Définir le modèle de Deque qui contient l'ensemble des opérations permettant de la manipuler

Nom Paramètres Rôle


Deque Initialiser une Dequc
InitDeque
Deque Vérifier si une Dequc est vide
DequeVide
Deque, sens
Extremite Retourner l'élément qui se trouve soit en tête soit en
queue (sans le supprimer)
Deque, x, sens Ajouter l'élément « x » soit en tête soit en queue
EnDequer
Deque, x, sens
DeDcquer Supprimerun élément soit en tête soit en queue et le
retourner dans « x »

sens est un paramètre défini pour désigner l'exfrémité à utiliser. Il sera égal à
• (+1) si lecture/ajout/suppressionsc font en tête
(-1) si lecture/ajout/suppression se font en queue.
3. Ecrire les opérations suivantes (en utilisant le modèle de Deque):
• Enfiler et défiler dans le cas où la Deque est une file FIFO.
Empiler et dépiler dans le cas où la Deque est une pile LIFO.
4. Ecrire unc fonction récursive qui permet de vérifier si le mot contenu dans une Deque est un
palindrome (en utilisant le modèle de Deque). Rappeler qu'un palindromc est un mot qui se lit
de la même manièrede gauche.àdroiteet de droiteà gauchecomme « radar », « été », «
ressasser », « selles »...

Vous aimerez peut-être aussi