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:
6=1+2+3
O próximo número perfeito é o 28 , pois:
28=1+2+4+7+14
Quando a soma dos divisores próprios de um número n é inferior a n, dizemos que n é deficiente. Por outro lado, quando esta soma é maior que n, n é dito abundante. Escreva uma função em Haskell, sem o uso direto de recursão, que receba um número n 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 fi n `mod` d == 0) [1n-1]. Logo, definimos:

Passo 3

Para classificar n, comparamos sumDivs a n. Usamos guardas para devolver a String certa:
– se sumDivs < n, devolvemos “deficiente”
– se sumDivs == n, 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 sumDivs sem precisar de recursão explícita.

Resposta

classify :: Int -> String
classify n
| sumDivs < n = “deficiente”
| sumDivs == n = “perfeito”
| otherwise = “abundante”
where
sumDivs = sum $ filter (\d -> n mod d == 0) [1…n-1]

Exercícios relacionados