Corrigé Exercice Algorithme NS7598

4
Exercices d’algorithmique : Correction Une bonne fa¸ con de comprendre les algorithmes pr´ esent´ es dans la suite est d’essayer, avec de petites valeurs pour les param` etres, de simuler l’ex´ ecution du programme. Cela permet de comprendre ` a quoi servent les variables du programme, en observant les diff´ erentes valeurs prises durant une ex´ ecution. 1 Suite de Fibonacci Voici deux fa¸cons de calculer la suite de les ´ el´ ements de la suite de Fibonacci. La premi` ere remplit un tableau T contenant toutes les valeurs de la suite, la seconde n’utilise que deux variables a (pour stocker f n-1 ) et b (pour f n ). function res = f ibo(n) function b = f ibo 0 (n) T = zeros(1,n); T (1) = 1; a = 1; T (2) = 1; b = 1; for i =3: n for i =3: n c = a + b; T (i)= T (i - 1) + T (i - 2); a = b; b = c; end end res = T (n); Pourquoi ces algorithmes sont-ils corrects ? Dans f ibo 0 par exemple, on peut prouver par r´ ecurrence qu’` a la fin d’une boucle i, la variable a contient f i-1 et la variable b contient f i . Pour les cas de bases n = 1 et n = 2, b contient f n avant la boucle. 2 Nombres binaires L’algorithme suivant renvoie un tableau de deux cases, la premi` ere contient le quotient et la seconde le reste de la division euclidienne. function T = div euclide(a, b) q = 0; r = a; % commentaire ici while r > b q = q + 1; r = r - b; % et ici aussi end T (1) = q; T (2) = r; 1

description

Corrigé de la série d'exercices NS7598

Transcript of Corrigé Exercice Algorithme NS7598

  • Exercices dalgorithmique : Correction

    Une bonne facon de comprendre les algorithmes presentes dans la suite est dessayer, avecde petites valeurs pour les parametres, de simuler lexecution du programme. Cela permet decomprendre a quoi servent les variables du programme, en observant les differentes valeurs prisesdurant une execution.

    1 Suite de Fibonacci

    Voici deux facons de calculer la suite de les elements de la suite de Fibonacci. La premiereremplit un tableau T contenant toutes les valeurs de la suite, la seconde nutilise que deuxvariables a (pour stocker fn1) et b (pour fn).

    function res = fibo(n) function b = fibo(n)T = zeros(1, n);T (1) = 1; a = 1;T (2) = 1; b = 1;for i = 3 : n for i = 3 : n

    c = a + b;T (i) = T (i 1) + T (i 2); a = b;

    b = c;end endres = T (n);

    Pourquoi ces algorithmes sont-ils corrects ?Dans fibo par exemple, on peut prouver par recurrence qua la fin dune boucle i, la variable

    a contient fi1 et la variable b contient fi. Pour les cas de bases n = 1 et n = 2, b contient fnavant la boucle.

    2 Nombres binaires

    Lalgorithme suivant renvoie un tableau de deux cases, la premiere contient le quotient etla seconde le reste de la division euclidienne.

    function T = div euclide(a, b)q = 0;r = a;% commentaire iciwhile r > b

    q = q + 1;r = r b;

    % et ici aussiendT (1) = q;T (2) = r;

    1

  • Cet algorithme renvoie bien le quotient et le reste de la division euclidienne de a par b.En effet, on peut prouver (par recurrence encore) quau niveau des commentaires, lequationa = b q + r est verifiee. Or lalgorithme ne sort de la boucle while que si r est plus petit queb, la deuxieme condition pour la division euclidienne est alors verifiee.

    Il existe plusieurs facons de traduire un nombre binaire decrit par un tableau de 0 et de 1en un nombre decimal. Une premiere facon consiste a simuler la formule

    16i6n

    ai 2(i1).

    function d = bin to dec(B)n = length(B);d = 0;for i = 1 : n

    d = d + B(i) 2(i1);end

    Soit n un nombre, la suite des divisions euclidiennes par 2 donne :

    n = q1 2 + a1q1 = q2 2 + a2q2 = q3 2 + a3

    . . .qn2 = qn1 2 + an1qn1 = 0 2 + an

    avec les ai < 2, dou

    n = (((. . . (an 2 + an1) 2 + . . .) 2 + a3) 2 + a2) 2 + a1

    Cela inspire un autre algorithme nutilisant pas la fonction puissance :

    function d = bin to dec(B)n = length(B);d = 0;for i = n : 1

    d = d 2 + B(i);end

    En developpant la precedente egalite, on obtient

    n = an 2n1 + an 2n1 + . . . + a3 22 + a2 21 + a1 20

    et donc la formule voulue pour la decomposition en binaire de n. La suite de divisions eucli-diennes par 2 nous donne donc une methode pour lalgorithme traduisant un nombre dans sarepresentation binaire.

    function B = dec to bin(d)i = 1;T = [ a 0 ];while T (1) > 0

    T = div euclide(q, 2);B(i) = T (2);i = i + 1;

    end

    2

  • Enfin, il est possible de sommer 2 nombres binaires contenus dans des tableaux de memetaille n dans un tableau de taille n + 1.

    function B = somme bin(B1, B2)n = length(B1);% ret correspond a la retenueret = 0;for i = 1 : n

    % On somme chaque colonne sans oublier la retenue.% La division euclidienne nous permet dobtenir% le chiffre et la retenue qui est propagee.T = div euclide(B1(i) + B2(i) + ret, 2)B(i) = T (2);ret = T (1);

    endB(n + 1) = ret;

    3 Maximum et Tri

    Les fonctions calculant le maximum (ou lindice du maximum) dun tableau sont simples :il suffit de parcourir tout le tableau et, a chaque nouvelle plus grande valeur, mettre a jour leresultat.

    function m = max(T ) function j = max indice(T )n = length(T ); n = length(T );m = T (1); j = 1;for i = 2 : n for i = 2 : n

    if m < T (i) if T (j) < T (i)m = T (i) j = i

    end endend end

    La fonction de tri utilise une fonction qui echange deux valeurs dun tableau. Lalgorithmeconsiste a trouver le plus nombre, et a lechanger avec le premier element du tableau, puis derecommencer sur le reste du tableau.

    function T = tri(T )% On cherche le i-eme plus petit% dans le reste du tableau. function T = echange(T, i, j)for i = 1 : (n 1) temp = T (i);

    pp = i; T (i) = T (j);for j = (i + 1) : n T (j) = temp;

    if T (j) < T (pp);pp = j

    endend% pp est lindice du plus petit% element du tableau [T(i) ... T(n)].T = echange(T, i, pp);% le tableau [T(1) ... T(i)]% est maintenant trie.end

    end

    3

  • Deux algorithmes cherchant un nombre dans un tableau (si lelement est present, on renvoieson indice, sinon on renvoie 1) sont presentes en parallele. Le premier cherche dans un tableaunon trie en parcourant tous les elements. On sarrete si lelement a ete trouve ou si tous leselements ont ete parcourus. Le deuxieme cherche de facon dichotomique : g et d represente lesbornes gauche et droite du sous-tableau ou x est cherche. A chaque etape, on regarde le milieude cet intervalle, en le comparant avec x on sait alors dans quelle partie du tableau chercher.

    function p = present(T, x) function b = present tri(T, x)g = 1;d = length(T );

    i = 1; i = floor((g + d)/2);while T (i) = x && i d

    p = 1; p = 1;else else

    p = i; p = i;end end

    Les tests a la fin determinent de quelle facon est-on sorti de la boucle while : dans un cas xnest pas present (on renvoie 1), dans lautre on connait son indice.

    4

    Suite de FibonacciNombres binairesMaximum et Tri