Jump to content

[Resolvido] Lista com elementos duplicados


Recommended Posts

Posted

Boas,

Decidi começar a programar em haskell e compre um livro e estou a tentar resolver alguns exercícios sobre dados duplicados.

Estou com dificuldade em responder a uma questão que diz: Defina uma função que devolve True caso os dados da lista sejam repetidos ex lista [1,2,2] ou False caso os dados não sejam repetidos ex: lista [1,2,3].

Cumprimentos,

Posted

Obrigado por ter respondido à mensagem eu acho que já consegui fazer com que a função receba um dado valor:

duplicado              :: (Eq a) => [a] -> [a]
duplicado []		   =  []

Não estou a conseguir criar outra função para cada elemento da lista dada 😞 . Terei de fazer algo do genero ?

duplicado (x:xs)	   =  x : duplicado  (\y -> not (x == y) xs)

Mas, assim estou a devolver uma lista não estou a retornar True ou False.

Cumprimentos

Posted

Pronto, vou postar o código para tipo generico, se quiseres especificamente para Int, no cabeçalho da funçao nao precisa do (Eq a) =>


existe :: (Eq a) => a -> [a] -> Bool
existe a [] = False
existe a (x:xs) = if a == x then True else existe a xs

repetidos :: (Eq a) => [a] -> Bool
repetidos [] = False
repetidos (x:xs) = if existe x xs then True else repetidos xs
  • Vote 1
Posted

Obrigado mais uma vez pela ajuda.

Quero ver se percebo o teu código por isso vou fazer um genero de debug 🙂 .

terminal

repetidos [1,2,3,2]

-> true

1º começamos no repetidos que recebe um elemento

2º se a lista for vazia retorna falso.

3º no existe recebemos o 1º elemento da lista (não interessa se é inteiro ou char etc...)

4º se for lista vazia então retorna falso.

5º se o 1º elemento (a) for igual ao 2º elemento (x) então true (acho que o programa compara o 1º elemento com o da lista toda) caso contrario muda o 'a' para o segundo elemento e compara novamente com a lista toda etc....

Cumprimentos,

Posted

Eu agora queria fazer um programa para repetir os numero da lista ex: repetir [1,3,5] resultado -> [1,3,3,3,5,5,5,5,5] tive a pesquisar e verifiquei que tenho de utilizar um take e um repeat só para inteiros.

existe xs = take y (repeat x)

Só que não me está a dar correcto alguma ideia ?

Posted

boa ideia

consegui isto

myReplicate				 :: Int -> a -> [a]
myReplicate n x | n <= 0    = []
		    | otherwise = x : replicate (n-1) x

só falta dar uma lista ou seja, eu meto myReplicate [1,2,3] resultado -> [1,2,2,3,3,3]

Alguma ideia ?

Posted (edited)

Repara no que tens:

myReplicate :: Int -> a -> [a]

estás a dizer, estou a espera de um inteiro, e um outro tipo de dado qualquer, e vou devolver uma lista, será que é mesmo assim que queres?

Edited by mundo
Posted

sim quero inteiros só. Acho tem de ser assim:

myReplicate :: [int] -> [int]

eu dou uma lista [2,3,5]

depois devolve uma lista [2,2,3,3,3,5,5,5,5,5]

Não se tratava de devolver Inteiro, até podias devolver batatas lol,

O acontecia é que dizias que querias uma lista, e nao estavas a dizer que o argumento era uma lista, mas sim um tipo genérico

Posted

Não sou moderador do forum nem nada do genero, mas carrega na opção a dizer que o tópico está resolvido, se já nao tens questões, e caso venhas a ter dúvidas de novas funções cria um novo tópico, pois depois facilita na procura de tópicos

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.