• Aucun résultat trouvé

R´ecuristvit´e R´ecursivit´eettableaux CorrectionduT.P.2

N/A
N/A
Protected

Academic year: 2022

Partager "R´ecuristvit´e R´ecursivit´eettableaux CorrectionduT.P.2"

Copied!
4
0
0

Texte intégral

(1)

Institut Galil´ee Algorithmique et programmation C Ing´enieurs 1`ere ann´ee (MACS/T´el´ecom/Mesures/Energie)

Correction du T.P. 2

R´ ecursivit´ e et tableaux

Pour tous les exercices de cette feuille, il vous est demand´e d’´ecrire l’algorithme correspondant au probl`eme avant son impl´ementation en langage C.

R´ ecuristvit´ e

Ecrire en C la fonction factorielle et la tester. Ecrire les versions it´eratives avec boucleforetwhileainsi qu’une version r´ecursive. Pour les versions it´eratives, donner la complexit´e des algorithmes propos´es.

#include <stdio.h>

int factFor(int n) {

int j, r =1;

for(j=1;j<=n;j++) r = r * j;

return r;

}

int factWhile(int n) {

int j, r =1;

while(n>0) {

r = r * n;

n--;

}

return r;

}

int factRec1(int n) {

return (n==0) ? 1 : n * factRec1(n-1);

}

int factRec2(int n) {

if(n==0) return 1;

else

return n * factRec2(n-1);

}

int main(void) {

int a;

1

(2)

printf("Donnez un entier positif : ");

scanf("%d", &a);

printf("%d! donne : par for %d par while %d par rec1 %d par rec2 %d \n", a, factFor(a), return 0;

}

Tableaux

1. Ecrire une fonction qui affiche les ´el´ements d’un tableau d’entiers, ainsi que leurs indices et la tester. Donner la complexit´e de l’algorithme corre- spondant.

void affiche(int tab[], int n) {

int i;

printf("Voici le tableau de %d elements:\n", n);

for(i=0;i<n;i++)

printf("tab[%d] = %d \n",i, tab[i]);

}

2. Ecrire une fonction r´ecursive qui teste si deux tableaux d’entiers sont iden- tiques et la tester. Ecrire une version it´erative du probl`eme en ´evaluant sa complexit´e.

3. Ecrire une fonction it´erative qui teste si deux tableaux d’entiers sont iden- tiques et la tester. Quelle est la complexit´e de l’algorithme correspondant?

4. Ecrire une fonction qui compte le nombre d’occurrences d’un ´el´element dans un tableau et la tester.

5. En d´eduire une fonction qui teste si deux tableaux d’entiers contiennent les mˆemes ´el´elments, sans tenir compte de l’ordre dans lequel les ´el´ements sont rang´es. Tester cette fonction.

#include <stdio.h>

#define MAX 10

#define VRAI 0==0

#define FAUX 0==1 typedef int bool;

bool tablo_ego(int t1[], int t2[], int n, int i) {

bool result;

if(i==n-1)

result = (t1[i]==t2[i]);

else

result = (t1[i]==t2[i]) && tablo_ego(t1, t2, n, i+1);

return result;

}

void compare_rec(int t1[], int t2[], int n)

2

(3)

{

if (tablo_ego(t1, t2, n, 0))

printf("Les deux tableaux sont egaux.\n");

else

printf("Les deux tableaux sont differents.\n");

}

void compare_iter(int t1[], int t2[], int n) {

int i;

bool pas_fini=VRAI;

for ( i=0; i<n && pas_fini; i++) if (t1[i]!=t2[i])

pas_fini=FAUX;

if (pas_fini)

printf("Les deux tableaux sont egaux.\n");

else

printf("Les deux tableaux sont differents.\n");

}

int nb_occ(int tab[], int a, int n, int i) {

int result;

if (i==n-1) {

result = (a==tab[i])?1:0;

} else {

printf(" a : %d, tab[%d]: %d, n: %d\n", a, i, tab[i], n);

if(a==tab[i])

result = 1 + nb_occ(tab, a, n, i+1);

else

result = nb_occ(tab, a, n, i+1);

}

printf(" a : %d, tab[%d]: %d, result: %d\n", a, i, tab[i], result);

return result;

}

void meme_elems( int t1[], int t2[], int n) {

int i, j;

bool pas_fini=VRAI;

for(i=0; i<n && pas_fini; i++) for(j=0;j<n;j++)

if(t1[i]==t2[j])

if (nb_occ(t1, t1[i], n, 0) != nb_occ(t2, t2[j], n, 0)) pas_fini=FAUX;

if(pas_fini)

printf("Les deux tableaux contiennent les memes elements.\n");

3

(4)

else

printf("Les deux tableaux ne contiennent pas les memes elements.\n");

}

int main(void) {

int my_tab1[MAX]={2,4,6,8,10,12,14,16,18,20};

int my_tab2[MAX]={1,3,5,7,9,11,13,15,17,19};

int my_tab3[MAX]={2,6,8,10,4,12,14,16,18,20};

affiche(my_tab1,MAX);

affiche(my_tab2,MAX);

affiche(my_tab3,MAX);

printf("Version recursive : \n");

compare_rec(my_tab1, my_tab1, MAX);

compare_rec(my_tab1, my_tab2, MAX);

compare_rec(my_tab1, my_tab3, MAX);

printf("Version iterative : \n");

compare_iter(my_tab1, my_tab1, MAX);

compare_iter(my_tab1, my_tab2, MAX);

compare_iter(my_tab1, my_tab3, MAX);

printf("Memes elements : \n");

meme_elems(my_tab1, my_tab1, MAX);

meme_elems(my_tab1, my_tab2, MAX);

meme_elems(my_tab1, my_tab3, MAX);

return 0;

}

4

Références

Documents relatifs

2:3:4: En d´eduire le temps de chute total T de l’aimant dans le conducteur et le comparer `a celui T 0 de sa chute dans un tube de verre de mˆemes caract´eristiques

Les ´ el´ ements de G sont donc les classes modulo 100 des entiers dont le dernier chiffre est 1 en ´ ecriture d´ ecimale... On a, en utilisant que K est

C’est le nombre de 3-listes d’´ el´ ements distincts des 20 concurrents, car l’ordre compte et les ´ el´ ements sont distincts (un concurrent ne peut pas occuper 2 places

II. Montrer qu’il existe une base orthonorm´ ee de E dans laquelle u est diagonalisable. mˆemes valeurs propres, avec les mˆemes multiplicit´es).. Montrer que deux ´ el´ements de

puis parcourir ce tableau et allouer chaque sous-tableaux le raisonnement peut s’´ etendre ` a n dimensions (pas de limite) diff´ erent des tableaux d´ eclar´ es t[][] : ´ el´

En supposant que le d´ eplacement d’un plateau soit une instruction ´ el´ ementaire, quelle valeur de n peut traiter l’ordinateur pr´ ec´ edent en 10 milliards d’ann´

D´emontrer que les carr´es des modules d’´el´ements de Z[i] sont exactement les sommes de deux carr´es dans N. En d´eduire que l’ensemble des sommes de deux carr´es dans N

3 ◦ ) Probl` eme: On dispose de deux tableaux A et B (de dimensions respectives N et M), tri´ es par ordre croissant. Fusionner les ´ el´ ements de A et B dans un troisi` eme