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

Nazgulled

Função que devolve um par com 1º e 2º maiores números de 3 inteiros

12 mensagens neste tópico

Eu já não pego em Haskell há mais de um ano e hoje estava e tentar fazer um exercício básico e não consegui. Quer dizer, consegui, mas foi com uma solução parva cheia de ifs e de certeza que há outra solução. Eu devo andar parvo para não conseguir resolver aquilo de forma decente... Mas agora fiquei a pensar naquilo e preciso de uma solução melhor ou vou dar em doido.

Notem que isto é um exercício da primeira ficha, nada de coisas complexas podem ser usadas (e nem devem ser preciso).

Tenho a função com a seguinte assinatura:

parmaior :: Int -> Int -> Int -> (Int, Int)

A ideia é passar 3 inteiros e devolver um par com o maior inteiro na primeira posição do par e o segundo maior na segunda posição do par. Qual a forma mais simples de fazer isto? Se for preciso, suponham que existe uma função maior :: (Int, Int) -> Int que pressuponho que deduzem facilmente o que faz e que é um dos exercícios anteriores na ficha.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já tentei resolver isso algumas vezes, e a única forma que via de simplificar isso era usar as funções que aparecem nos exercícios anteriores da ficha (não sei se nessa também aparece).

Caso contrário, era menos com ifs.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ainda não tenho muita experiência com haskell, mas fiz isto em 2 minutos. Mas dá para simplificar mais .. Mas já é um inicio lolol

medio :: Int -> Int -> Int -> Int
medio x y z	| y<=x && y>=z || y>=x && y<=z = y 
		| x<=y && x>=z || x>=y && y<=z = x
		| z<=x && z>=y || z>=x && z<=y = z

max3 :: Int -> Int -> Int -> Int
max3 x y z	| x>=y && x>=z = x
		| y>=x && y>=z = y
		| z>=x && z>=y = z

parmaior :: Int -> Int -> Int -> (Int, Int)
parmaior x y z = (max3 x y z, medio x y z)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A única função relevante (penso eu) que está nos exercícios anteriores ou até mesmo no próprio enunciado como exemplo é essa do maior ou uma chamada maiorde3 que usa a maior para calcular o maior de 3 números.

Mas eu continuo a achar a minha solução demasiado confusa, tipo:

parmaior :: Int -> Int -> Int -> (Int, Int)
parmaior x y z = let (a,b) = if(x>y) then (x,y) else (y,x)
                    (c,d) = if(a>z) then (a,z) else (z,a)
                    (e,f) = if(b>d) then (c,b) else (c,d)
                 in (e,f)

@mystics

Isso ainda é mais confuso que a minha solução e usas ai uma função extra (medio) que quase de certeza que não será necessário. Se for necessário usar funções extra, deve ser funções de exercícios anteriores ou faladas no enunciado e essa não faz parte. Afinal de contas isto é a primeira ficha. Outro problema da tua solução são as guardas que ainda não foram ensinadas e na minha própria solução, o let/in também não o foi, apenas o if then else é que foi ensinado (para já).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu usei funções extra para se perceber melhor lolol.. Porque eu estava a fazer como tu

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas de certeza que a minha solução dá para ser simplificada. O que eu pretendia era remover o let/in porque é como disse, estes são os 1º exercícios da 1ª ficha, o let/in ainda não foi ensinado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
maiores x y z =
  if x == maiorde3 x y z
    then (x, max y z)
    else
      if y == maiorde3 x y z
        then (y, max x z)
        else (z, max x y)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Parece ser mais simples e não usa o let/in... Mais simples não deve haver right?

Obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais simples talvez só usando listas e ordenações, o que não deve ser boa ideia...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pode ser do tipo:

funcao :: Num a => [a] -> [a]
funcao = take 2 . sort

Mais simples talvez só usando listas e ordenações, o que não deve ser boa ideia...

Pode não ser eficiente, mas faz o pretendido e em pouco código e simples.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pode não ser eficiente, mas faz o pretendido e em pouco código e simples.

Pelo que me lembro do enunciado do ano passado, recebe um triplo, e devolves um par. Logo, terias de complicar um pouco mais a função (depois também acho que tinhas que fazer um reverse pelo meio).

Mas o maior problema, é que isto é um exercício das primeiras fichas de PF, e foi por isso que eu disse que não é boa ideia usar as listas, e as ordenações. Um aluno normal não o saberia resolver o exercício dessa forma.

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