• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Virtual Void

[CAML] Ajuda:Funçao que devolve a intercepçao de dois conjuntos

2 mensagens neste tópico

sou novo nisto do caml e estou kom algumas dificuldades para fazer uma funçao que devolva a intercepçao de dois conjuntos, ou seja

conj1=[1;2;3;4;5] conj2=[2;3;5;6;7]  intersecçao= [2;3;5]

aqui está o que tenho feito, mas n está afazer nada do qe eu quero:


let rec contem x conj=
if conj=[]
then false
else let h::t =conj
in if x=h
then true
else contem x t;;


let rec intersect conj1 conj2=
if conj1=[] || conj2 =[]
then []
else let h1::t1=conj1
in if contem h1 conj2
then h1::intersect t1 conj2;;

alguma sugestao? obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é tarde, mas aqui vai mesmo assim uma solução possível:

let intersec l1 l2 = fold_left (fun a e -> if (mem e l1) then e::a else a) []  l2

obviamente esta codificação dos conjuntos por listas supõe que não há elementos repetidos.

Uma solução um pouco mais cuidadosa é

let intersec l1 l2 = fold_left (fun a e -> if ((mem e l1) & ! (mem e a)) then e::a else a) []  l2

existe também soluções elegantes usando  outras funções do módulo List como filter ou partition

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora