Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

nuno35

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

Mensagens Recomendadas

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

Editado por pwseo
Correcção do título, formatação, alguns erros...

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por thoga31

Knowledge is free!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :)

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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?

 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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).

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.