Jump to content
nuno35

Recursividade: encontrar elemento em lista, dividir string em strings de tamanho fixo

Recommended Posts

nuno35

Boa Noite 

Estou aqui com dúvidas em dois exercícios. Um é encontrar um elemento numa lista para o qual o predicado seja verdadeiro tenho duas formas, mas não sei se estão corretas:

-- 1ª Forma
encontra predicado " " = Nothing
encontra predicado (x:xs)
	|predicado x == True = x
	|otherwise encontra predicado xs

-- 2º Forma
encontra predicado lista =
	let lista = filter predicado lista
	lista!!0

na segunda forma não sei como posso devolver a posição 0

O segundo exercício é dividir uma string numa lista de string de tamanho k

Exemplo:

> Fatias 3 "olalisboa"
["ola","lis","boa"]

Se não for uma divisão certa a última string pode ter mais um ou menos 1 elementos

Alguém me pode dar uma ajuda nestes exercícios?

desde já Obrigado

Edited by pwseo
Correcção do título, formatação, alguns erros...

Share this post


Link to post
Share on other sites
thoga31

Não entendi o primeiro exercício do predicado.

Quanto ao segundo:

fatias _ [] = []
fatias n xs = take n xs : fatias n (drop n xs)

Cumprimentos.

Edited by thoga31

Knowledge is free!

Share this post


Link to post
Share on other sites
pwseo

@nuno35,

Tomei a liberdade de editar o título deste tópico (tens dado títulos muito gerais e pouco descritivos) e de corrigir alguns pomenores de linguagem no teu post de abertura.

Passemos às tuas dúvidas.

No caso da função encontra, considero inválida a 2ª forma que forneceste, porque não é recursiva; simplesmente recorres à função filter que faz toda a recursividade por ti, e penso que não era esse o objectivo. Posto isto, qual é a assinatura da função encontra? É suposto aplicar-se apenas a Strings?

Vamos por partes. Isto é o que tu pretendes com a função encontra:

Citação

encontrar um elemento numa lista para o qual o predicado seja verdadeiro

Podemos, portanto, assumir que encontra deve aceitar como parâmetros um predicado (ie. uma função que aceita um valor de um determinado tipo de dados t e devolve um Bool) e uma lista ([t]). Como existe a possibilidade de não haver nenhum elemento que cumpra o predicado, temos que poder devolver um valor Nothing, pelo que podemos assumir que a assinatura será algo assim:

--             o predicado  
--               |          a lista 
--           vvvvvvvvv     vvv
encontra :: (t -> Bool) -> [t] -> Maybe t

Vou definir o caso base por ti, e deixo o caso geral (recursivo) para definires:
 

encontra :: (t -> Bool) -> [t] -> Maybe t
-- seja qual for o predicado, se a lista for vazia, devolver Nothing
encontra _ [] = Nothing
-- Caso geral: para completares
encontra pred (x:xs) | pred x    = ...
                     | otherwise = ...

-- Nota: `pred x` e `pred x == True` são a mesma coisa

Se completares os espaços acima, terás uma função que não quer saber que tipo de dados estás a utilizar, e que te devolve um valor do tipo t envolvido num Maybe (Just t ou Nothing).

 

Quanto ao segundo exercício o @thoga31 já se pronunciou. Vai falando das tuas dúvidas :)

Share this post


Link to post
Share on other sites
nuno35

já consegui fazer esta função fiz muito parecido a tua solução.

encontra predicado [] = Nothing 
encontra predicado (x:xs)
	|predicado x == True = x
	|otherwise = encontra predicado xs

So nao percebi o porque de teres posto "-- Caso geral: para completares" falta algum caso geral? 

Achas que a função transposta pode ser colocada aqui ou criar um tópico novo?

 

Share this post


Link to post
Share on other sites
pwseo
36 minutos atrás, nuno35 disse:

já consegui fazer esta função fiz muito parecido a tua solução.

...

So nao percebi o porque de teres posto "-- Caso geral: para completares" falta algum caso geral?

O «-- Caso geral: (...)» dizia respeito às linhas seguintes, que tu completaste, e muito bem :) Tenho apenas um reparo a fazer: predicado x == True é redundante, e podes substituir por predicado x apenas (é a mesma coisa).

Share this post


Link to post
Share on other sites

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.