Jump to content

Recommended Posts

Posted

Alguém me ajuda a resolver isto:

Vamos representar um ponto por um par de números que representam as suas coordenadas no plano Cartesiano.

type Ponto = (Float,Float)

(a) Defina uma função que recebe 3 pontos que são os vértices de um triângulo e devolve um tuplo com o comprimento dos seus lados.

(b) Defina uma função que recebe 3 pontos que são os vértices de um triângulo e calcula o perimetro desse triângulo.

© Defina uma função que recebe 2 pontos que são os vértices da diagonal de um rectângulo paralelo aos eixos e constroi uma lista com os 4 pontos desse rectângulo.

Posted (edited)

Começa por definir a assinatura da função:

compLados :: Ponto -> Ponto -> Ponto -> (Float, Float, Float)

depois e só calculares a distancia entre os três pontos como já te foi sugerido:

compLados a b c = (distancia a c, distancia b c, distancia a b)

Se conseguires fazer a alínea a), fazes a b) sem problemas.

Edited by jpedro20
Posted

Preciso de uma sugestão:

Tava a criar a funçao reverse por mim mesmo mas acho que compliquei um pouco apesar de isto funcionar perfeitamente. Se alguém tiver uma alternativa mais simples que diga. Deixo aqui o meu codigo.

Nota: O objectivo é nao recorrer a funçoes já definidas no prelude.

reverse2 :: [a] -> [a]

reverse2 x = auxiliar (length2 x) x

auxiliar :: Int -> [a] -> [a]

auxiliar 0 [] = []

auxiliar n x | n /= 0 = last2(take2 n x):(auxiliar (n-1) x)

| otherwise = []

length2 :: [a] -> Int

length2 [] = 0

length2 (x:xs) = 1 + length2 xs

take2 :: Int -> [a] -> [a]

take2 0 _ = []

take2 x (y:ys) = y:(take2 (x-1) ys)

last2 :: [a] -> a

last2 [x] = x

last2 (x:xs) = last2 xs

Posted (edited)

E que tal esta?

reverse' [] = []
reverse' (x:xs) = (reverse' xs) ++ [x]

Não é uma versão optimizada, mas parece-me bastante simples e fácil de perceber. Se reparares bem, o próprio código parece ser uma tradução directa do conceito de fazer reverse.

A versão optimizada deveria ter um acumulador e fazer uso de tail recursion...

Edited by pwseo
Posted

E que tal esta?

reverse' [] = []
reverse' (x:xs) = (reverse' xs) ++ [x]

Não é uma versão optimizada, mas parece-me bastante simples e fácil de perceber. Se reparares bem, o próprio código parece ser uma tradução directa do conceito de fazer reverse.

A versão optimizada deveria ter um acumulador e fazer uso de tail recursion...

E que tal esta?

reverse' [] = []
reverse' (x:xs) = (reverse' xs) ++ [x]

Não é uma versão optimizada, mas parece-me bastante simples e fácil de perceber. Se reparares bem, o próprio código parece ser uma tradução directa do conceito de fazer reverse.

A versão optimizada deveria ter um acumulador e fazer uso de tail recursion...

ta mt bem pensado...thanks

Posted

Só falta dizer que a versão do jpedro20 é a versão optimizada que referi acima, e que todas as funções do Prelude estão disponíveis na source do próprio GHC, por isso, em caso de dúvida, podes sempre consultar a implementação de referência, tendo em conta que nem sempre estarão lá as versões mais intuitivas (por motivos de optimização, claro).

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