Ir para o conteúdo
nana91

Exercicios de listas

Mensagens Recomendadas

nana91

Olá pessoal. Tenho aqui dois exercicios que não consigo realiza-los:

1- Calcula a lista formada pelos montantes dos elementos correspondentes das duas listas. Se uma das listas tem mais elementos do que os outros, os elementos extras não têm qualquer influência no resultado.

Ex:

Main> somaListas [1..10] [5..7]

[6,8,10]

Este é o exercicio que mais me irrita pois eu tenho a perfeita noção que é facilimo, mas não estou a ver como.

2- Dadas duas listas de inteiros, calcula True se a primeira lista é um prefixo do segundo e False caso contrário. A lista X é um prefixo da lista Y se todos os elementos de X aparecem em Y antes de quaisquer outros elementos da Y, na mesma ordem.

Ex:

Main> prefixos [1,2,3][1..1000]

True

Main> prefixos [5..8][1..1000]

False

Só preciso que me dêm alguma dica para estes dois.

;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nana91

As funções take e length são as seguintes:

length :: [int] -> Int
length [] = 0
length (x:xs) = 1 + length xs

take :: Int -> [int] -> [int]
take (x+1) (y:ys) = y : take x ys
take _ _ = []

Certo?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Existe uma coisa chamada Hoogle, que é tipo o Google do Haskell, onde podes procurar informação sobre as funções predefinidas como take e length (eu não ia inventar nomes aleatórios, não é?).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nana91

Eu ao escrever as funções take e length tinha a perfeita noção que não eram funções com nomes aleatórios. Na verdade eu continuo com dificuldade no exercício nº2 pois não consigo relacionar a função take com a length podes explicar-me melhor, não há outra maneira.

O exercicio 1 está resolvidissimo, obrigado pela dica.  ;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nana91

Preciso de dicas para estes exercícios, só dicas nada mais:

3- Dado uma lista de listas de inteiros, calcula a lista composta pelos elementos que aparecem nas listas sozinhos na lista de listas. A lista sozinha é uma lista com exatamente um elemento.

Main> s [[2,3],[4],[],[6,7,8],[9],[]]

[[4],[9]]

4- Dada uma lista não-vazia de listas de inteiros, calcula a mais longa lista na lista de listas.

Main> l [[3..6],[7..9],[4..10],[4..5],[3..3],[2..5]]

[4,5,6,7,8,9,10]

5- dada uma lista de números inteiros, calcula o lista das somas dos prefixos da lista, tomada em ordem crescente do comprimento.

Main> p [5,1,2,7,4]

[5,6,8,15,19]

;)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
nana91

Olá no exercício 3 como posso usar o filter e o length se o filter selecciona os elementos duma lista que satisfazem um predicado (isto é, uma funçaõ cujo o resultado é um valor boleano).

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Polmax

se o filter da um booleano de acordo com um predicado

então o teu predicado seria aparecer na lista sozinho

com o lenght verificas se aparecem sozinhos ou com mais de um elemento e com o filter dizes que so queres os elementos de quando o lenght é verdadeiro ou seja quando o comprimeiro é igual a 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Polmax

sinceramente eu não uso muito filter nas minhas funções mas também podes usar aqui.

eu faria algo mais simples

selecionar ::[[int]]->[[int]]
selecionar []=[]
selecionar (x:xs) |length x ==1 =x:selecionar xs
                  |otherwise = selecionar xs

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

A solução com o filter não tem nada que saber, é só filtrar da lista parâmetro aquelas cujo comprimento é igual a 1.

s l = filter (\x -> length x == 1) l

Ou de forma mais sucinta:

s = filter $ (==1) . length

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Para veres como era fácil:

maior [] = []
maior [x] = x
maior (x:y:xs) | length x >= length y = maior (x:xs)
               | otherwise = maior (y:xs)

Partilhar esta mensagem


Ligação 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

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.