Questão 7: Defina uma função chamada raizSegGrau que recebe os coeficientes a, b e c de uma equação de segundo grau no formato:
a x^2+b x+c=0
e retorne uma lista contendo as raízes reais da respectiva equação. Note que essa lista pode vir a ser vazia (se a equação não tiver raízes reais), e que se a a=0, sua função deve calcular uma raiz de equação de primeiro grau. Observe também que a lista de raízes não deve apresentar raízes repetidas. Além da função raizSegGrau, você também deve definir:
  • Uma função para calcular uma raiz de equação de primeiro grau;
  • Uma função para calcular o discriminante De;
  • Uma função para calcular a raiz relativa a raiz quadrada positiva de De;
  • Uma função para calcular a raiz relativa a raiz quadrada negativa de De;
Exemplos:
> raizSegGrau 1 (-5) 6
[3, 2]
> raizSegGrau 2 4 2
[-1]
> raizSegGrau 3 1 1
[]
> raizSegGrau 0 3 12
[-4]

Passo 1

O enunciado pede para criarmos, em Haskell, uma função raizSegGrau que receba coeficientes a, b e c e retorne uma lista com as raízes reais da equação ax²+bx+c=0, tratando também o caso degenerado (a=0) como equação de 1º grau. Além disso, precisamos definir funções auxiliares para: Δ (discriminante), raiz de 1º grau, raiz positiva e raiz negativa de Δ.

Passo 2

Vamos começar definindo o discriminante Δ, que nos diz se há raízes reais e serve de base para Bhaskara. A fórmula é Δ = b² − 4·a·c.

Passo 3

Para o caso degenerado em que a=0, trata-se de equação de 1º grau bx + c = 0. A raiz única é x = −c/b. Vamos criar uma função raiz1Grau.

Passo 4

Quando a≠0 e Δ≥0, as duas raízes de Bhaskara são dadas por:
x₁ = −b + raizΔ2·a
e
x₂ = −b − raizΔ2·a
Vamos criar funções raizPosDelta e raizNegDelta que usam Δ e devolvem x₁ e x₂.

Passo 5

Por fim, juntamos tudo em raizSegGrau: 1) se a=0, chamamos raiz1Grau e colocamos o resultado numa lista; 2) se Δ<0, retornamos lista vazia; 3) se Δ=0, retornamos [raizPosDelta] (a raiz simples); 4) se Δ>0, retornamos [raizPosDelta, raizNegDelta]. Não precisamos remover duplicatas extra porque tratamos Δ=0 em separado.

Passo 6

Segue o código completo:
-- Calcula o discriminante Δ = b^2 - 4ac
delta :: Double -> Double -> Double -> Double
delta a b c = b * b - 4 * a * c

-- Raiz de equação de 1º grau bx + c = 0, assume b ≠ 0
raiz1Grau :: Double -> Double -> Double
raiz1Grau b c = - c / b

-- Raiz usando a parte + de Bhaskara
raizPosDelta :: Double -> Double -> Double -> Double
raizPosDelta a b c = (- b + sqrt (delta a b c)) / (2 * a)

-- Raiz usando a parte - de Bhaskara
raizNegDelta :: Double -> Double -> Double -> Double
raizNegDelta a b c = (- b - sqrt (delta a b c)) / (2 * a)

-- Função principal: retorna lista de raízes reais sem repetição
raizSegGrau :: Double -> Double -> Double -> [Double]
raizSegGrau 0 b c
  = [raiz1Grau b c]
raizSegGrau a b c
  | d < 0     = []
  | d == 0    = [raizPosDelta a b c]
  | otherwise = [raizPosDelta a b c, raizNegDelta a b c]
  where d = delta a b c

Resposta

O código acima implementa todas as funções pedidas e faz com que raizSegGrau se comporte conforme os exemplos do enunciado.

Exercícios relacionados