Questão 7: Defina uma função chamada raizSegGrau que recebe os coeficientes
e
de uma equação de segundo grau no formato:
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
, 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
;
- Uma função para calcular a raiz relativa a raiz quadrada positiva de
;
- Uma função para calcular a raiz relativa a raiz quadrada negativa de
;
Exemplos:
> raizSegGrau 1 (-5) 6
[3, 2]
> raizSegGrau 2 4 2
[-1]
> raizSegGrau 3 1 1
[]
> raizSegGrau 0 3 12
[-4]
> 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:
e
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.