Jump to content
Sign in to follow this  
almostF

Calcular media de um MSet a

Recommended Posts

almostF

boas

tenho que fazer uma função que tem o seguinte tipo 

type Mset a = [(a,Int)] 
media:: MSet Float -> Float 

, o meu problema é calcular a função média, que consiste em calcular a média de um multiconjunto nao vazio, o numero de vezes em que apareçe o elemento é relevante para a média

exemplo de um Multiconjunto no tipo MSet a ,    {'a','b','c','a','a'} é representado por [('a',3),('b',1),('c',1)]

cumps


almost there .

Share this post


Link to post
Share on other sites
Betovsky

Se estiver a perceber o que pretendes não é simplesmente fazer o somatório dos Floats, multiplicando cada um pelo número de vezes que aparecem. E dividir pelo somatório dos Ints?


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
almostF

type MSet a = [(a,Int)]

media:: MSet Float -> Float
media [] = 0
media [(a,b)] = 1
media f@((a,b):(d,e):as) = aux1 f / aux2 f

aux1:: MSet Float -> Float
aux1 [] = 0
aux1 [(a,b)] = (a*fromIntegral b)
aux1 ((a,b):(d,e):as) = ((a*fromIntegral b)+(d*fromIntegral e)+aux1 as)

aux2::MSet Float -> Float
aux2 [] = 0
aux2 [(a,b)] = fromIntegral b
aux2 ((a,b):(d,e):as) =(fromIntegral b + fromIntegral e)+ aux2 as

fica isto entao ?

cumps


almost there .

Share this post


Link to post
Share on other sites
Betovsky

Parece-me que sim, apesar que tens partes que não são necessárias.

E depois tens isto errado: media [(a,b)] = 1

A média de um só elemento na lista não pode ser 1. Tens de fazer também os cálculos que neste caso é apenas multiplicar o 'a' pelo 'b'


"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Share this post


Link to post
Share on other sites
KiNgPiTo

Mais limpinha:

media :: MSet Float -> Float
media xs = (sum (aux xs))/(fromIntegral (length (aux xs))) where
aux [] = []
aux (x:xs) = (aux2 x)++(aux xs)
aux2 (x,1) = [x]
aux2 (x,n) = x:(aux2 (x,n-1))

Boa sorte para amanhã ;)

Share this post


Link to post
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
Sign in to follow this  

×
×
  • 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.