• Aucun résultat trouvé

fonctions sur les listes

N/A
N/A
Protected

Academic year: 2022

Partager "fonctions sur les listes"

Copied!
6
0
0

Texte intégral

(1)

Cours de l’option informatique

Lyc´eeLouis-le-Grand

Ann´ee

1 ✬✫

Rapp els sur le langage Caml

sommaire

—liaisonsglobalesetlocales;

—fonctionssurleslistes;

—it´erateurssurleslistes;

—typesetfiltrages;

—styleimp´eratif;

—effetsdebord

2

liaisons globales et lo cales

#leta=2;;

a:int=2

#a+3;;

-:int=5

#letb=3ina+b;;

-:int=5

#b;;

Entr´eeinteractive:

>b;;

>^

L’identificateurbn’estpasd´efini.

3 ✬✫

fonctions sur les listes

longueur:’alist->int

accolle:’alist->’alist->’alist

membre:’a->’alist->bool

adjoint:’a->’alist->’alist

union:’alist->’alist->’alist

intersection:’alist->’alist->’alist

miroir:’alist->’alist

produitcart´esien:

’alist->’alist->(’a*’a)list

Instructionfailwith"messaged’erreur"

4

(2)

letreclongueur=function

|[]->0

|_::q->longueurq+1;;

letrecaccoleab=matchawith

|[]->b

|t::q->t::(accoleqb);;

letrecmembrex=function

|[]->false

|t::q->t=x||membrexq;;

letrecadjointx=function

|[]->[x]

|t::q->ift=xthent::qelset::(adjointxq);;

letrecunionab=matchawith

|[]->b

|t::q->unionq(adjointtb);;

letmiroira=

letreceverseab=matchawith

|[]->b

|t::q->d´everseq(t::b)

in

eversea[];;

5 ✬✫

it ´erateurs sur les listes

map:(’a->’b)->’alist->’blist

dolist:(’a->unit)->’alist->unit

itlist:(’a->’b->’a)->’a->’blist->’a

listit:(’a->’b->’b)->’alist->’b->’b

itlistfx[a;b;c]s’´evalueenf(f(fxa)b)c

listitf[a;b;c]xs’´evalueenfa(fb(fcx))

Applications:´ecrirelesfonctions

minlistmaxlistsumlistflatlist

6

letrecmapf=function

|[]->[]

|t::q->(ft)::(mapfq);;

letrecdo_listf=function

|[]->()

|t::q->ft;do_listfq;;

letrecit_listfx=function

|[]->x

|t::q->it_listf(fxt)q;;

letreclist_itflx=matchlwith

|[]->x

|t::q->ft(list_itfqx);;

letmin_listl=it_listminmax_intl;;

(*max_intestleplusgrandentiermachinedoncleneutredemin*)

letsum_listl=it_list(funab->a+b)0l;;

letflat_listl=it_list(funab->a@b)[]l;;

7 ✬✫

filtrage standard sur les listes

letrecma_fonction...l=matchlwith|[]->...

|t^ete::queue->...(ma_fonction...queue)

ouencore,cequirevientexactementaumˆeme:

letrecma_fonction...=function

|[]->...|t^ete::queue->...(ma_fonction...queue)

Doncl’utilisationdefunctionestenr´ealit´eunfiltrage.

Onn’utiliserafun(quipermetdemultiplesarguments)qu’avec

parcimonie.

8

(3)

ty p e s Caml `a utiliser

typessimplesintfloatboolcharunit

typesconstruitsdebaselistvectstring

attention:lesdeuxdernierssontmutables!

typessommeIlspeuventˆetrer´ecursifs!Unexempleplussimple:

typecarte=As|Roi|Dame|Valet|Nofint

typesproduitCesontlesenregistrementsd’autreslangages:

typecitoyen={nom:string;nos´ecu:int;...}

9 ✬✫

v ecteurs et c h aˆınes

Sivestdutype’avect,ses´el´ementssontdutype’a.Onlesindexe

`apartirde0:v.(i)estl’´el´ementd’indicei,qu’onpeutmodifierenplaceparuneinstructionv.(i)<-x.

Unechaˆınedecaract`eresestpresqueunvecteurdechar:le

caract`ered’indiceidelachaˆınesests.[i]qu’onpeutmodifier

commeci-dessus.L’op´erateurdeconcat´enationestnot´e^.

Utiles:vectlengthstringlengthinitvectmakevect

init_vect:int->(int->’a)->’avectmake_vect:int->’a->’avect

Attentionaupi`ege!cr´eerunematrice...

10

ty p e s somme

typecarte=As|Roi|Dame|Valet|Nofint;;

typecouleur=Pique|Cœur|Carreau|Tr`efle;;

leta=Asandb=N8;;

typecarte_`a_jouer==carte*couleur;;

letc=As,Tr`efle;;

letpoints_beloteatout=function

|As,_->11|Roi,_->4|Dame,_->3

|Valet,c->ifc=atoutthen20else2

|(N9),cwhenc=atout->14

|(N10),_->10|_->0;;

11 ✬✫

ty p e s pro duit

D´efinitiondutype:

typepoint={x:int;y:int;

couleur:color;visible:bool};;

Cr´eationd’unevaleur:tousleschampsdoiventˆetrerenseign´es

leta={visible=true;couleur=red;x=0;y=3}

Filtrage:onpeutnefiltrerquesurquelqueschamps

matchxwith{visible=true;couleur=red}->...

Exemple:leslistesrevisit´ees

type’acellule={valeur:’a;suite:’aliste}

and’aliste=Nil|Lof’acellule;;

´Ecrire:filtrer:(’a->bool)->’aliste->’aliste

12

(4)

Ons’inspireduprogrammehabituel:

letrecfiltrerpred=function|[]->[]

|t::q->ifpredtthent::(filtrerpredq)elsefiltrerpredq;;

pour´ecrire:

letrecfiltrerpred=function

|Nil->Nil|L{valeur=t;suite=q}

->ifpredtthenL{valeur=t;suite=filtrerpredq}

elsefiltrerpredq;;

13 ✬✫

ecapitulatif des motifs de filtrage

<identificateur><constante>(<motif>)

<motifsansliaison>|<motifsansliaison>

<motif>as<identificateur>

<motif>when<expressionbool´eenne>

<motif>,<motif><motif>::<motif>

<Constructeur>(<motif>){<s´electeur>=<motif>;...}

14

Structures de con trˆ ole

for<identificateur>=<valeur>(to|downto)<valeur>

do

<instruction>

done;;

while<expressionbool´eenne>

do

<instruction>

done;;

Cesdeuxinstructionsont,bienentendu,unevaleur,quiest()(du

typeunit).

15 ✬✫

ef ´erences

Cr´eation:leta=ref[]andb=ref2;;

Consulation:match!awith[]->2+!b

Modification:a:=2::!a;b:=3+!b;;

`Arapprocherdel’utilisationdesvecteursetdeschaˆınesdecaract`eres.

Champsmutablesdansuntypeproduit.

Int´erˆetsetpr´ecautions`aprendre.

Exemple:quicksort.

16

(5)

Le tri rapide (quic ksort)

Pourtrierles´el´ementsd’indicesi`aj(inclus)d’untableauv:

1.onposex=vi;

2.onr´eorganiseletableau(entreietj)etontrouvertelque

∀k∈{i,...,r−1},vkxvr=x∀k∈{r+1,...,j},vk>x

3.ontrie(r´ecursivement)lestranchesd’indicesi`ar−1etr+1`aj.

Lecoˆutdanslecaslepire(lequelest-il)estO(n 2).

LecoˆutmoyenestO(nlgn).

17 ✬✫ letquicksortv=

letn=vect_lengthv

in

letscindeij=

letr=refi

andx=v.(i)

in(*v.(i..r-1)<=x=v.(r)<v.(r+1..k)*)

fork=i+1tojdoifv.(k)<=xthen

(v.(!r)<-v.(k);incrr;v.(k)<-v.(!r))

done;

v.(!r)<-x;

!r

in

letrectriij=ifi<jthen

letk=scindeij

in(trii(k-1);tri(k+1)j)

in

tri0(n-1);;

18

Autres tris classiques

Le tri par insertion

C’estletridesjoueursdescartes:aufuret`amesurequ’unecarte

estdistribu´ee,onlarange`asaplacedanssamain.

Algorithmiquement,ils’agitdoncd’´ecrireunefonctiond’insertion

dansunelistetri´ee.

Cetriestquadratique,etadapt´e`alastructuredeliste.

Le tri par s´election

Onextraitleminimum,ontrier´ecursivementcequirestede

l’ensembleinitial.Iln’yaplusqu’`aplacerentˆeteleminimumcalcul´e.

Ils’agitl`aencored’untriquadratique,bienadapt´eauxlistes.

19 ✬✫

Le tri-fusion (merge-sort)

Ond´ecoupel’ensembledecl´es`atrierendeuxparties`apeupr`es

´egales,qu’ontrier´ecursivement.Iln’yaplusqu’`afusionnerdeux

ensemblestri´es.

Cetriestadapt´e`alastructuredeliste,ild´ecouledirectementdu

paradigme“diviserpourr´egner”ets’av`ereefficace,puisqu’enO(nlgn).

20

(6)

(*triparinsertion*)

letrecins`erex=function|[]->[x]

|t::q->ifx<=tthenx::t::qelset::(ins`erexq);;

letrectri_insertion=function

|[]->[]

|[x]->[x]|t::q->ins`eret(tri_insertionq);;

21 ✬✫ (*triparelection*)

letrecextrait_minimum=function|[]->failwith"Listevide"

|[x]->x,[]|t::q->letm,q’=extrait_minimumq

inift<=mthent,qelsem,t::q’;;

letrectri_s´election=function

|[]->[]|l->letm,r=extrait_minimuml

inm::(tri_s´electionr);;

22

letrecfusionl1l2=matchl1,l2with

|[],_->l2

|_,[]->l1

|t1::q1,t2::q2

->ift1<=t2thent1::(fusionq1l2)

elset2::(fusionl1q2);;

letrececoupe=function

|[]->[],[]

|[x]->[x],[]

|a::b::q->letq1,q2=d´ecoupeq

in

a::q1,b::q2;;

letrectri_fusion=function

|[]->[]

|[x]->[x]

|l->letl1,l2=d´ecoupel

in

fusion(tri_fusionl1)(tri_fusionl2);;

23 ✬✫

Qu’app elle-t-on effet de b ord ?

et programmation fonctionnelle ?

R´ef´erences,vecteurs,champsmutables...

Maisaussi:entr´ee-sorties,toutegestiondel’interface(biblioth`eque

graphics)etdescommunications...

24

Références

Documents relatifs

C’est le tri des joueurs des cartes : au fur et ` a mesure qu’une carte est distribu´ee, on la range ` a sa place dans sa main. Algorithmiquement, il s’agit donc d’´ ecrire

Certaines fonctions pouvant ˆetre d´efinies dans plusieurs biblioth`eques, il est prudent de pr´eciser la d´efinition que l’on souhaite utiliser.

Certaines fonctions pouvant ˆetre d´efinies dans plusieurs biblioth`eques, il est prudent de pr´eciser la d´efinition que l’on souhaite utiliser.

Dans cet exercice, vous devez utiliser les fonctions

Le syst` eme informatique d’une biblioth` eque enregistre le num´ ero national, le nom, le pr´ enom et l’adresse (rue, num´ ero, code postal, ville) de chacun de ses clients.. Le

– mode ne doit contenir que des droits d’accès – on ne peut détruire qu’un répertoire vide.

Le mot clé rec indique à Ocaml que l'identiant fact employé dans la dénition de la fonction correspond à la fonction que l'on dénit. Syntaxe de la dénition d'une fonction

Test d’une seule entrée : la technique consiste à effectuer un « masquage » (ET logique bit par bit) du registre d’entrée (pour neutraliser l’état des autres entrées), puis à