Jump to content

Funçao maoir de 3 inteiros


barrinhos123!
 Share

Recommended Posts

Boas eu sou muito novo na programação em haskell e precisava de uma ajudinha neste exercício.

O objectivo implementar uma função que retorne o maior de 3 valores , utilizando uma função que retorna o maior de 2 valores

max2::(Int,Int) -> Int
max2 (x,y) = if  x < y then y  
                                else x

max3::(Int,((Int,Int) -> Int)) -> Int
max3 (a,(max2(x,y))) = if a < max2 then max2
                                                        else a

não faço ideia como usar a função max2 dentro da função max3...

obrigado

Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

Olá, bem-vindo! 😉

Primeira coisa a ter em mente: as regras de sintaxe do Haskell. Uma função tem esta sintaxe geral:

funcao :: TipoArg1 [-> TipoArg2 -> ...] -> TipoOutput
funcao arg1 [arg2 ...] = --comandos

Primeira questão: há algum motivo pelo qual estás a usar Tuples no argumento das funções max2 e max3?

Neste caso os argumentos das tuas funções são numéricas. Do lado esquerdo do igual ( = ) deverás indicar através de identificadores os vários argumentos, que são dois:

max3 x y z = --comandos

Ou seja, o primeiro argumento tem o identificador "x" (ou seja, é o seu nome), e assim em diante.

Portanto, não podes usar nenhuma função do lado esquerdo do sinal de igual: esta é a área reservada a identificar os dados de entrada da função. Todo e qualquer cálculo será feito apenas do lado direito, incluindo a aplicação da função max2.

Agora chega a parte em que tens de descobrir o maior número dos três usando a função max2. Aqui vão umas pistas...

Considera os números 2, 5 e 7. Podes agrupar estes números em pares. Vamos pegar nos dois primeiros números: 2 e 5. O maior número é o 5. Agora comparamos o 5 com o que sobra, que é o 7, e concluimos que o maior é o 7.

Ou seja, em termos genéricos:

  1. Temos três números de entrada: X, Y e Z.
  2. Qual o maior número entre X e Y? Vamos-lhe chamar M.
  3. Agora, qual o maior entre M e Z?
  4. Obtivemos o maior número dos três.

Como em Haskell não tens variáveis, tens de pensar numa forma de juntar isto tudo numa só expressão.

Dica: o resultado de uma função pode ser usado como argumento de outra função.

Com o código que apresentaste demonstraste ter uma ideia do algoritmo e aplicar isto em Haskell apenas requer que tenhas de manter em mente estas coisinhas que te disse. 🙂

Da minha explicação, esclarece todas as dúvidas que te surgirem. 😉

Cumprimentos.

Edited by thoga31

Knowledge is free!

Link to comment
Share on other sites

Sei que foi uma pergunta básica. Mais que a resposta agradeço a explicação. Tirou me duvidas que não sabia que tinha...

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

Este foi o código final. Agora vejo ainda mais a simplicidade do problema. Compila e funciona na perfeição!

Muito Obrigado!

Edited by thoga31
Tags code + GeSHi
Link to comment
Share on other sites

@barrinhos123!, não sei se vens de outra linguagem de programação ou se esta é a tua primeira de todas. Se vieres de outra LP, então entendo em parte os motivos por achares os tuplos mais intuitivos. Mas, em qualquer dos casos, este só devem ser utilizados quando são necessários. Neste caso eles são perfeitamente dispensáveis. Se usares sempre tuplos nas tuas funções, perderás a oportunidade de trabalhar com as funções mais básicas do Haskell e que ajudam em boa medida a tornar esta na linguagem fenomenal que é.

Uma vez que já chegaste a uma solução, vou apresentar a minha:

max2 x y = if x>=y then x else y

max3 x y = max2 x . max2 y

Aqui está um exemplo em que algumas destas particularidades do Haskell entram em acção usando múltiplos argumentos em vez de um único argumento do tipo tuplo. Faço notar, portanto, que a função max3 recebe 3 argumentos apesar de apenas 2 estarem indicados. 😉

Knowledge is free!

Link to comment
Share on other sites

Sim ,venho doutras linguagem de programação já dei uns toques em c e c++ mas pouco. Não sabia que havia grane diferença em usar tuplas ou trabalhar com as funções normalmente , como o thoga31 disse , é intuitivo mas mais uma vez obrigado.

já agora thoga31, desculpa a pergunta, não percebo como e que a tua função max3 recebe 3 argumentos e tu só indicas 2?

Link to comment
Share on other sites

barrinhos123!,

O thoga31 utilizou uma particularidade de Haskell que ainda não compreenderás completamente... A função max3 dele na realidade recebe 2 argumentos e devolve... uma função que recebe 1 argumento (o argumento que faltava! e portanto, 2 + 1 = 3). É algo que compreenderás mais para a frente.

Quanto ao teu background em C/C++, era o que eu suspeitava, mas dou-te um conselho: limpa a mente para programar em Haskell. Se tentares agarrar-te ao que sabes de C/C++, vai ser muito mais difícil do que precisa ser 🙂

Link to comment
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
 Share

×
×
  • 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.