Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 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

Mensagens Recomendadas

Nazgulled    8
Nazgulled

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
mystics    0
mystics

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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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á).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Nazgulled    8
Nazgulled

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos
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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
silva.samuel    0
silva.samuel

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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    309
Rui Carlos

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.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade