Correction TD1

Télécharger au format pdf ou txt
Télécharger au format pdf ou txt
Vous êtes sur la page 1sur 6

Université Mohammed Premier Matières : AAC, AA

ENSA Al Hoceima Filières: GI1, GI2


Département de Mathématiques Année Universitaire: 2014/2015
et Informatique Prof: E. W. DADI

Correction TD 1

Exercice 1

Pour chacun des problèmes suivants, élaborer un algorithme itératif et récursif qui le résout :

1. Le nombre de chiffre d’un entier a.


Algorithme Version itérative
Fonction NbChiffres (a :entier) : entier
Var compteur :entier ;
Début
compteur :=1;
Tant que (a>10) Faire
a :=a/10 ;
compteur := compteur +1 ;
FinTQ
Retourner(compteur) ;
Fin
Algorithme Version récursive
Fonction NbChiffres(a :entier) :entier
Début
Si(a<10) alors
Retourner 1;
Sinon
Retourner NbChiffres(a/10)+1 ;
FinSi
Fin
2. La somme des chiffres d’un entier a.
Fonction SChiffres(a :entier) :entier Fonction SChiffres(a :entier) :entier
Var S, t : entier. Var S : entier.
Début Début
S:=0; S:=0;
Tantque(a>=1) Faire Tantque(a>=1) Faire
t:=(a/10); S :=S+(a%10) ;
S :=S+(a-t*10) ; a:=a/10;
a:=t; FinTq
FinTq Retourner(10);
Retourner(S)
Algorithme Version récursive Algorithme Version récursive
Fonction SChiffres(a :entier) :entier Fonction SChiffres(a :entier) :entier
Var t :entier ; Début
Début Si(a<10) alors
Si(a<10) alors Retourner a;
Retourner a; Sinon
Sinon Retourner
t :=a/10 ; NbChiffres(a/10)+(a%10) ;
Retourner NbChiffres(t)+(a-t*10) ; FinSi
FinSi Fin
Fin

3. Un algorithme qui test si un nombre a est premier (Comme algorithme de test de


primalité utilisez le suivant : Vérifier si a est divisible par l'un des entiers compris
entre 2 et 𝐚).
Algorithme Version itérative
Fonction Primalite (a :entier) : booléen
Var i : entier, test : booléen, r : entier ;
Début
test := vrai;
i :=2 ;
r := a ; // on calcule le racine qu’une seule fois.
TantQue (i<=r et test) Faire
Si(a%i=0) alors
test := faux;
FinSi
i++ ;
FinTq
Retourner(test) ;
Fin

Algorithme Version récursive


Fonction Primalite (a :entier, i entier) : booléen
Var i :entier, test : booléen;
Début
Si(i<a) alors
Si(a%i=0)
Retourner faux ;
Sinon
Retourner Primalite (a, i+1) ;
FinSi
Sinon
Retourner vrai ;
FinSi
Fin
4. Un algorithme qui calcule le PGCD de deux entiers positifs a et b en utilisant
l'algorithme d'Euclide.

Algorithme Version itérative


Fonction PGCD (a ,b :entier) : entier Fonction PGCD (a ,b :entier) : entier
Var i : entier, r: entier ; Var i : entier, r: entier ;
Début Début
Tantque(r :=(a%b)≠0) Faire Répéter
a :=b ; r :=a%b ;
b :=r ; a :=b ;
FinTq b :=r ;
Retourner(b) ; Jusqu'à (r≠0) ;
Fin Retourner(a) ;
Fin

Algorithme Version récursive


Fonction PGCD (a ,b :entier) : entier
Var r: entier ;
Début
r :=a%b ;
Si(r=0)
Retourner b ;
Sinon
Retourner PGCD (b,r) ;
FinSi
Fin

Exercice 2

Fonction MinT(T :tableau, n entier)


Var min, pos : entiers ;
Début
pos :=1 ;
Pour i allant de 2 à n Faire
Si(T[pos]<T[i] ) alors
pos :=i ;
FinSi
FinPour
Retourner (pos) ;
Fin
Fonction Insertion(T : tableau, x entier, pos entier, n entier)
Début
i : = n+1;
Tantque(i>pos) Faire
T[i] := T[i-1];
i-- ;
FinTq
T[i] := x ;
Fin
Fonction Suppression(T : tableau, pos entier, n entier)
Début
i :=n ;
Pour i allant de pos à n faire
T[i] := T[i+1];
FinPour
Fin

Fonction Ex2(T :tableau, x entier, n entier)


Var imin
Debut
imin :=MinT(T, n) ;
Insertion(T, x, imin+1, n) ;
Suppression(T, imin+1, n) ;
Fin

Exercice 3

La suite est constante (Un=1/3) donc l’algorithme qui calcule le nieme terme de cette suite doit
être très simple :

Fonction U(n :entier)


Début
Retourner 1/3 ;
Fin

Exercice 4

Fonction Puissance(x réel, n entier) :réel


Var p : réel
Début
i :=n ;
Si (n=0) alors
Retourner 1 ;
Sinon
Si(n%2=0) alors
p=Puissance(x , n/2) ;
Retourner p*p ;
Sinon
Retourner x* Puissance(x, n-1) ;
FinSi
FinSi

Exercice 5 :

Fonction F(n : Entier) : Entier;


Début
Si (n <= 1) Alors
Retourner n;
Sinon
Retourner 5 * F(n - 1) - 6 * F(n - 2);
FinSi
Fin

1- Pour prouver que la fonction F(n)= 3n – 2n, pour tout n ≥ 0, on va utiliser la


démonstration par récurrence.
Cas de bas :
 Pour n=0, on a F(0) = 30 – 20 = 1 - 1 =0, c’est bien ce que retourne l’algorithme
dans ce cas.
 Pour n=1, on a F(1) = 31 – 21 =1, c’est bien ce que retourne l’algorithme dans ce
cas.
Cas récursif : Supposons que l’algorithme retourne F(k)= 3k– 2k pour 0 ≤ k ≤ n,
montrons que c’est bien le cas pour n+1.
D’après l’algorithme on a :
F(n+1) = 5 * F(n ) - 6 * F(n - 1)
= 5 * (3n - 2n ) - 6 * (3n-1 - 2n-1)
= 5 * 3n - 5 * 2n - 2 * 3 * 3n-1 + 3 * 2 * 2n-1
= 5 * 3n - 5 * 2n - 2 * 3n + 3 * 2n
= 5 * 3n - 5 * 2n - 2 * 3n + 3 * 2n
= 3 * 3n - 2 * 2n
= 3n+1 - 2n+1 CQFD
2- En utilisant un tableau, écrire un algorithme itératif G(n) qui soit équivalent à F(n).
3- Donner la preuve de l’algorithme G(n).
D’après la Q1 l’invariant de boucle est 3i– 2i et puisqu’on a montré par récurrence
qu’il vrai pour tout n alors l’algorithme est correct.

Exercice 6 :

1- Calculer E(8,3) et E(9,2).

2- Qu’est ce qu’il fait cet algorithme ?


L’algorithme retourne le quotient et le reste de la division euclidienne de a et b.
3- Donner la preuve de l’algorithme.
Preuve de terminaison :
La condition d’arrête de la boucle tant que est lorsque R<B et puisque la valeur de R
décroit à chaque itération d’une valeur de B. A un certain nombre d’itération R devient
< B à ce moment là l’algorithme se termine.
Preuve de correction :
B= b
R0 = a
Q0= 0
Ri = Ri-1− B => Ri = Ri-2 − B – B => Ri = R0 – i B=a- ib
Qi = Qi-1 + 1 => Qi = Qi-2 + 1+1=> Qi = Q0 + i = i
D’après la question 2 et d’après ce qui précède :

a= Ri+ ib, Ri et i sont respectivement le reste et le quotient de la division de a sur b. on


a Qi = i
L’invariant de boucle de l’algorithme alors est : « a= Ri+ Qib »
Il reste à montrer par récurrence que l’invariant reste vrai à chaque itération.

Vous aimerez peut-être aussi