• Aucun résultat trouvé

1.Triparinsertion. II.Trisparinsertionetparfusion I.Récursivité.

N/A
N/A
Protected

Academic year: 2022

Partager "1.Triparinsertion. II.Trisparinsertionetparfusion I.Récursivité."

Copied!
3
0
0

Texte intégral

(1)

Informatique 2009-2010 : TD 4. MPSI B Hoche

I. Récursivité.

La récursivité est un concept qui généralise la notion de suite définie par récur- rence.

Une procédure (ou fonction au sens informatique) estrécursivelorsqu’elle s’appelle elle même.

Certains langages (dont Maple) autorisent cette manière de mettre en oeuvre un algorithme. Il est particulièrement important de prouver que l’algorithme va s’ar- rêter. En général on introduit pour cela un nombre entier qui doit strictement décroitre d’un appel à l’autre. Un exemple simple est donné par la définition (du cours) des coefficients du binôme.

cbin:=proc(n,p) if p=0 or p=n then

1 else

cbin(n-1,p-1) + cbin(n-1,p);

fi;

end:

cbin(5,2);

Dans cet exemple le nombre qui diminue strictement à chaque appel est n+p. On peut former une procédure qui rend mieux compte de ce qu’elle fait.

nbappel:=0;

cbinbavard:=proc(n,p) global nbappel;

local texte;

nbappel:=nbappel+1;

texte:= "appel numero" || nbappel || " , n=" || n || " , p=" || p;

print(texte);

if p=0 or p=n then 1

else

cbinbavard(n-1,p-1) + cbinbavard(n-1,p);

fi;

end:

cbinbavard(3,2);

Remarquer qu’il est indispensable d’utiliser une variable globale pour compter le nombre d’appels de la procedure. Remarquer l’opérateur de concaténation k qui permet d’envoyer vers l’écran un joli texte.

Bien noter qu’une procédure récursive doit contenir dès le début une structure de contrôleifcomprenant une branche qui se termine sans s’appeler. Cette branche correspond à l’initialisation de la récursivité. Sans cela la boucle infinie est assurée.

Enregistrez avant d’exécuter.

II. Tris par insertion et par fusion

Fichiers Maple à télécharger :Pproc.mwUn tableau de nombres étant donné, on doit ranger les valeurs de ce tableau par ordre croissant.

On considère deux méthodes : le tri par insertion et le tri par fusion. On va implémenter des tris "en place" en utilisant des variables globales pour désigner le tableau et la taille du tableau. Le tableau initial sera donc modifié par les procédures. Les noms utilisés sont

A: tableau donné

n: entier ;Aest indexé de 1 àn.

Des corrigés sont proposés sur unefeuille de travailà télécharger.

1. Tri par insertion.

Le principe de la procédure principaleins()est le suivant (figure1) : – Parcourir le tableau donné de 1 àn.

– Insérer lavaleur courantedu tableau dans le début du tableau qui se trouve ainsi partiellement ordonné.

La procédure principale utilise une autre procédureinserer_valeur(p)qui insère à la bonne place la valeurA[p] dans le tableau entre 1 etp. Il est à noter que au moment de l’appel deinserer_valeur(p), les valeurs de 1 àp-1sont croissantes.

La tâche deinserer_valeur(p) est donc de trouver la bonne place et d’y placer A[p]en décalant les valeurs suivantes (figure2).

Le point important dans cette deuxième procédure est de parcourir le tableau endescendantdepà 1. Il est à noter que le nomcleest local àinserer_valeur().

Vous devez rédiger ces procédures en syntaxe Maple.

Cette création est mise à disposition selon le Contrat

Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/

1 Rémy Nicolai TD0904

(2)

Informatique 2009-2010 : TD 4. MPSI B Hoche

Fig.1 – Tri par insertion : procédure principale

2. Implémentation récursive du tri par fusion.

Le principe du tripar fusionrepose sur le fait qu’il est assez facile de fusionner deux listes déjà triées en une liste triée.

Imaginons deux piles de copies de maths. Chaque pile est triée par ordre alphabé- tique avec le nom vers le haut, la copie du dessus (la seule visible) est la première par ordre alphabétique. On choisit alors entre les deux copies visibles celle dont le nom est avant l’autre dans l’ordre alphabétique et on forme ainsi une troisième pile (en retournant la copie choisie). En continuant le processus, les deux piles dimi- nuent tandis que le tas de copie retournées augmente. Lorsque les deux piles sont vides, le tas retourné est complètement trié avec le début de l’alphabet au dessus.

Evidemment, un des deux tas sera vide avant l’autre. On peut alors retourner d’un coup le tas restant puisqu’il est déjà trié.

Ce processus est assez commode à mettre en œuvre pratiquement, il permet aussi à plusieurs personnes de travailler simultanément (au début) en triant des paquets arbitraires avant la fusion finale. Cette manière de procéder à un aspect récursif.

Ce mode de tri sera implémenté avec deux procédures utilisant les variables

Fig.2 – Tri par insertioninserer_valeur(p)

globalesAetnpour désigner le tableau et sa taille.

La procédure principale (figure3) est appelée parfus(p,q). Elle doit ordonner les valeurs deAentre les indices pet qpassés en paramètres (avecp inférieur ou égal àq).

Lorsque les paramètres sont proches, la procédure range directement le tableau.

Lorsquepetqsont éloignés, la procédure calcule unmentre les deux, s’appelle elle même deux fois (récursivité) entrepet mpuis entrem+1et qet appelle ensuite la procédurefusionner(p,m,q)qui fusionne les deux parties du tableau.

La procédurefusionner(p,m,q)doit ordonner les valeurs du tableauAentre les indices p et q comme expliqué (figure 4 au début avec l’exemple des copies.

Le tableau étant partiellement trié (depàm et dem+ 1 à q). On remarque que

Cette création est mise à disposition selon le Contrat

Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/

2 Rémy Nicolai TD0904

(3)

Informatique 2009-2010 : TD 4. MPSI B Hoche

Fig.3 – Tri par fusion : procédure principale récursivef us(p, q)

le diagramme utilise une variable localeB destinée à recevoir transitoirement les valeurs ordonnées. Il utilise aussi trois clés, une pour chaque "petite" pile et une pour le tableau transitoireB.

Vous devez rédiger ces procédures en syntaxe Maple.

Fig.4 – Fusion des deux parties du tableau : f usionner(p, m, q)

Cette création est mise à disposition selon le Contrat

Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/

3 Rémy Nicolai TD0904

Références

Documents relatifs

Paternité-Pas d'utilisations commerciale-Partage des Conditions Initiales à l'Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/.. 1

Paternité-Partage des Conditions Initiales à l'Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-sa/2.0/fr/.. 2 Rémy

Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/.. 1

Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/. 1

Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/. 1

Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/. 1

Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/b. 3

Paternité-Pas d’utilisations commerciale-Partage des Conditions Initiales à l’Identique 2.0 France disponible en ligne http://creativecommons.org/licenses/by-nc-sa/2.0/fr/.. 1