Jump to content

Dúvida Raizes


Sir Reng
 Share

Recommended Posts

Olá colegas.

Antes demais, só queria dizer que sou novo por aqui e a programar. E encontrei este forum, espero gostar e tentar ajudar no máximo que puder.

Mas estou aqui com uma dúvida que é o seguinte:

A funcão nRaizes que recebe os (3) coecientes de um polinomio de 2º grau e que

calcula o numero de raizes (reais) desse polinomio.

Eis o que fiz:

 Raizes :: Float -> Float -> Float-> Float
Raizes a b c = [(-(b)-sqrt (b)^2 -4*a*c)/2*a , (-(b)+sqrt (b)^2 -4*a*c)/2*a]

Agredeço a ajuda e que corrijam o que estiver mal, pois é com erros que se aprende 🙂

Edited by thoga31
Formatação do tópico + GeSHi
Link to comment
Share on other sites

Boa noite.

De facto tens vários problemas nesse código.

  1. Haskell é case-sensitive, ou seja, diferencia maiúsculas de minúsculas. Nesse sentido, os tipos de dados têm uma forma de escrever diferente do nome de funções. Um tipo de dados (por exemplo Float) é sempre capitalizado, isto é, a primeira letra é sempre maiúscula. Já as funções nunca são capitalizadas.
    Portanto, no teu caso, como Raizes está capitalizado, o Haskell está a considerar que Raizes é um tipo de dados, pelo que não percebe esta linha: Raizes :: Float -> Float -> Float-> Float. O nome da função deve começar em minúsculas.
    raizes :: Float -> Float -> Float -> Float  -- função em minúculas, e tem cuidado com o espaçamento entre "->" e "Float"
    

  2. Tu estás a devolver as raízes numa lista de dois elementos. O tipo de dados de saída da função não está correcto.
    raizes :: Float -> Float -> Float -> [Float]
    


    Tendo em conta que o resultado é sempre dois elementos, por que não utilizar um tuplo?

    type TupRaiz = (Float, Float)
    
    raizes :: Float -> Float -> Float -> TupRaiz
    

  3. Tem em atenção a prioridade das operações. A fórmula resolvente não está bem aplicada. Os números negativos "isolados" devem ficar entre parêntesis (por exemplo, o -b) e tens de rever umas bases de Matemática acerca de prioridade de operações: aplicaste mal os parêntesis em vários pontos.
    Esta é a forma correcta de o fazer, e porventura a mais apropriada para ti (estou a assumir que estás a iniciar agora a tua jornada pelo Haskell 🙂 ):
    raizes a b c = ( ((-b) + sqrt(b^2 - 4 * a * c)) / (2 * a) ,
                    ((-b) - sqrt(b^2 - 4 * a * c)) / (2 * a) )
    


    Ou então podemos usar uns operadores e funções muito característicos de Haskell, sendo esta a minha solução favorita:

    raizes :: Float -> Float -> Float -> TupRaiz
    raizes a b c = ( solve id , solve negate )
      where
         solve fn = (/(2 * a)) . (subtract b) . fn . sqrt . (subtract $ 4 * a * c) $ b^2
    

Cumprimentos 😉

Edited by thoga31
  • Vote 1

Knowledge is free!

Link to comment
Share on other sites

Agora é que vi bem. O problema diz-te para devolveres o número de raízes e não quais as raízes.

Nesse caso, tens é de verificar o binómio discriminante:

disc a b c = (subtract $ 4 * a * c) $ b^2

Knowledge is free!

Link to comment
Share on other sites

Okey, muito obrigado ! E sim estou a iniciar nisto, e em relação aos parenteses , fiquei confuso ali xD

Mais uma vez, obrigado ! 🙂

Edited by thoga31
Formatação da mensagem (remoção de cor desnecessária).
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.