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

luchhozito

sufixo

13 mensagens neste tópico

boas pessoal,

tenho um problema que é o seguinte:

quero fazer uma funcao que dado um [a] -> [a] -> Bool, exemplo "comodo" "incomodo" = True

tenho isto:

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] [] = False
sufixo [] a = False
sufixo a [] = False
sufixo x y | (length x < length y) = False

agora a parte do true , estou a pensar, mas queria uma opiniao se souberem :confused:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Seja n a diferença de comprimentos das duas listas. Só precisa de verificar se a primeira é igual à segunda, depois de teres deitado fora os primeiros n elementos da segunda lista.

PS:

sufixo [] [] = False
sufixo [] a = False

Alguma razão em especial para devolveres falso nestes casos?

PS2: Não precisas de testar o caso em que ambas as listas são vazias, pois este é apenas um caso particular dos dois seguintes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo x y | (length x < length y) = False
           | (drop (aux x y )y) = x 

aux :: [a] -> [a] -> Int		   
aux x y = length y - length x 

fiz isto , mas acho que n ta la mt bem :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Só estás a remover os elementos da 2ª lista. Depois não fizeste comparação nenhuma.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu consideraria a string vazia como sendo sufixo de qualquer string. No entanto podes resolver isso assim:

sufixo a b = (drop $ (length b - length a)) b == a

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo x y | (length x < length y) = False
           | ((drop $ (length y - length x)) y == x) = True

ja funciona :P thanks Baderous

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não precisas de escrever isso tudo. Aquela linha que eu escrevi basta (considerando a string vazia como sufixo de qualquer string).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

reparei numa coisa, com

sufixo a b = (drop $ (length b - length a)) b == a

se testares com duas palavas iguais, por exemplo: sufixo "comodo" "comodo" , ele devolve True... eu fiz a função de outra forma mas estou a ter o mesmo problema...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo a b | length b <= length a = False 
           | ((drop $ (length b - length a)) b == a) = True

assim ja resolve o problema penso eu.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

acrescentei masi uma linha de codigo

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo a b | length b <= length a = False 
           | ((drop $ (length b - length a)) b == a) = True
           | ((drop $ (length b - length a)) b /= a) = False

senão se fizesses por exemplo: sufixo "comodo" "batata" dava erro

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é necessária outra linha.

O que estão a fazer é, se x for verdadeiro, devolve verdadeiro, e se x for falso devolve falso. Quando isto acontece, podem devolver logo o x.

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo a b | length b <= length a = False 
           | otherwise = (drop $ (length b - length a)) b == a

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

lol o meu exemplo estava errado... ha casos em que vai devolver erro, experimenta fazer :

sufixo "completo" "completissimo"

penso que da erro quando a segunda lista é maior que a pimeira, "Non-exaustive patterns..."

com a linha de codigo que acrescentei acho que isso ja nao acontece...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é necessária outra linha.

O que estão a fazer é, se x for verdadeiro, devolve verdadeiro, e se x for falso devolve falso. Quando isto acontece, podem devolver logo o x.

sufixo :: (Eq a) => [a] -> [a] -> Bool
sufixo [] a = False
sufixo a [] = False
sufixo a b | length b <= length a = False 
           | otherwise = (drop $ (length b - length a)) b == a

esquece o que eu disse, eu estava-me a referir ao codigo anterior... como tens aí funciona perfeitamente!

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