programador400 Posted September 25, 2012 at 06:28 PM Report #476500 Posted September 25, 2012 at 06:28 PM 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.
KiNgPiTo Posted September 25, 2012 at 06:38 PM Report #476501 Posted September 25, 2012 at 06:38 PM Vais precisar de criar uma função que calcule a distancia entre 2 pontos (http://pt.wikipedia.org/wiki/Dist%C3%A2ncia_euclidiana) e depois para a a) é retornar um tuplo chamando a função 3 vezes para cada ponto do triângulo, para a b o mesmo mas a somar, a c não percebi bem o que pede...
programador400 Posted September 25, 2012 at 06:50 PM Author Report #476503 Posted September 25, 2012 at 06:50 PM Sinceramente sou novato disto...ou melhor ainda nao tive nenhuma aula disto...mas já me consigo desenrascar qq coisa mas empanquei neste exercicio
jpedro20 Posted September 25, 2012 at 07:54 PM Report #476510 Posted September 25, 2012 at 07:54 PM (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 September 25, 2012 at 07:54 PM by jpedro20
programador400 Posted September 26, 2012 at 09:02 PM Author Report #476694 Posted September 26, 2012 at 09:02 PM 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
pwseo Posted September 26, 2012 at 09:56 PM Report #476697 Posted September 26, 2012 at 09:56 PM (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 September 26, 2012 at 09:59 PM by pwseo
programador400 Posted September 26, 2012 at 10:08 PM Author Report #476700 Posted September 26, 2012 at 10:08 PM 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
jpedro20 Posted September 27, 2012 at 02:20 PM Report #476779 Posted September 27, 2012 at 02:20 PM reverse :: [a] -> [a] reverse l = rev l [] where rev [] a = a rev (x:xs) a = rev xs (x:a) http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC-List.html#reverse
pwseo Posted September 27, 2012 at 02:33 PM Report #476781 Posted September 27, 2012 at 02:33 PM 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).
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now