Questão 4: Em Matemática, um número perfeito é um número natural para o qual a soma de todos os seus divisores positivos proprios (excluindo ele mesmo) é igual ao próprio número. Por exemplo, o número 6 é um número perfeito, pois:
O próximo número perfeito é o 28 , pois:
Quando a soma dos divisores próprios de um número
é inferior a
, dizemos que
é deficiente. Por outro lado, quando esta soma é maior que
é dito abundante. Escreva uma função em Haskell, sem o uso direto de recursão, que receba um número
e retorne uma String informando se o mesmo é deficiente, perfeito ou abundante.
Passo 1
O enunciado pede para criar uma função em Haskell que, dado um número natural n, calcula a soma dos seus divisores próprios (ou seja, todos os divisores positivos menores que n) e, em seguida, retorna uma String indicando se n é “deficiente” (soma < n), “perfeito” (soma = n) ou “abundante” (soma > n), sem usar recursão direta.
Passo 2
Para obter a lista de divisores próprios de n, podemos usar uma lista de 1 até n−1 e filtrar aqueles que dividem n sem resto. Em Haskell, isso fica assim:
Com a lista de divisores em mãos, somamos todos os seus elementos usando a função de ordem superior
Passo 3
Para classificar n, comparamos
a
. Usamos guardas para devolver a String certa:
– se , devolvemos “deficiente”
– se , devolvemos “perfeito”
– caso contrário, devolvemos “abundante”
Por fim, reunimos tudo numa única função, utilizando a definição de guardas e o where para calcular sem precisar de recursão explícita.
– se
– se
– caso contrário, devolvemos “abundante”
Por fim, reunimos tudo numa única função, utilizando a definição de guardas e o where para calcular
Resposta
classify :: Int -> String
classify n
| sumDivs < n = “deficiente”
| sumDivs == n = “perfeito”
| otherwise = “abundante”
where
sumDivs = sum $ filter (\d -> n
classify n
| sumDivs < n = “deficiente”
| sumDivs == n = “perfeito”
| otherwise = “abundante”
where
sumDivs = sum $ filter (\d -> n
mod
d == 0) [1…n-1]