• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

luchhozito

duvida recursividade

16 mensagens neste tópico

Cotacoes = [(Moeda,Valor)]
Moeda = String
Valor = Float

maiorValor :: Cotacoes -> (Moeda,Valor)
maiorValor [] = ("",0)
maiorValor ((a,b):(c,d):xs) | (b>d) = (a,b) : maiorValor xs
                           | otherwise = (c,d) : maiorValor xs

sem a recursividade compila, assim não. estou aki virado , mas n consigo por isto direito.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(a,:P : maiorValor xs <--- Isto vai ser do tipo de lista de pares de qualquer coisa. Ora na assinatura da função dizes que vai ser um par de qualquer coisa, não uma lista. Por isso é que te dá erro, estás a retornar uma coisa diferente do que dizes que vais retornar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

depois tive pensar e realmente o : é pa listas :D .

maiorValor :: Cotacoes -> (Moeda,Valor)
maiorValor [] = ("",0.0)
maiorValor ((a,b):(c,d):xs) | (b>d) = maiorValor ((a,b):xs)
                           | otherwise = maiorValor ((c,d):xs)


*** Exception: C:\Users\tmn\Documents\exame0809.hs:(40,0)-(42,62): Non-exhaustive patterns in function maiorValor

ele compila bem, mas quando testo a funcao da-me este erro. caso paragem ne ??

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

y lol :)

type TabPrecos = [(Produto,Preco)]
type Produto = String
type Preco = Float

type Cotacoes = [(Moeda,Valor)]
type Moeda = String
type Valor = Float 

convPrecos :: TabPrecos -> Cotacoes -> Moeda -> TabPrecos
convPrecos [] _ m = []
convPrecos ((pt,pr):xtb) ((md,vl):xc) moeda | (moeda == md) = (pt,pr*vl) : convPrecos xtb xc moeda
                                           | otherwise = convPrecos xtb xc moeda

ja agora com os types atras descritos, so esta aplicar ao (pt,pr) , ja fiz a recursividade mas acho que falta algo.

edit:

quer dizer testei agora mas ele ta a ir buscaro (produto,preco) de acordo com a ordem da moeda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso assim não está bem, supondo que o que essa função faz é pegar na tabela de preços e, mediante as cotações, fazer a conversão de preços. A forma como detectas se a moeda é igual e a construção do 1º par está correcta, mas depois fazes isto (no 1º caso):

convPrecos xtb xc moeda 

Aqui, uma vez que já sabes qual a cotação da moeda, tens é de invocar a função com o resto da tabela de preços e o par das cotações que determinaste ser correspondente à moeda, ou seja:

convPrecos :: TabPrecos -> Cotacoes -> Moeda -> TabPrecos
convPrecos [] _ _ = []
convPrecos ((pt,pr):xtb) ((md,vl):xc) moeda | (moeda == md) = (pt,pr*vl) : convPrecos xtb (md,vl) moeda 
                                            | otherwise = convPrecos ((pt,pr):xtb) xc moeda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isso assim não está bem, supondo que o que essa função faz é pegar na tabela de preços e, mediante as cotações, fazer a conversão de preços. A forma como detectas se a moeda é igual e a construção do 1º par está correcta, mas depois fazes isto (no 1º caso):

convPrecos xtb xc moeda 

Aqui, uma vez que já sabes qual a cotação da moeda, tens é de invocar a função com o resto da tabela de preços e o par das cotações que determinaste ser correspondente à moeda, ou seja:

convPrecos :: TabPrecos -> Cotacoes -> Moeda -> TabPrecos
convPrecos [] _ _ = []
convPrecos ((pt,pr):xtb) ((md,vl):xc) moeda | (moeda == md) = (pt,pr*vl) : convPrecos xtb (md,vl) moeda 
                                            | otherwise = convPrecos ((pt,pr):xtb) xc moeda

esta funcao n compila :P , ja tive alterar , mesmo asim ....

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pois não, não reparei que meti um par em vez de uma lista. Mas mesmo assim, o modo de pensar dessa função é esquisito. Determinando-se as cotações relativas à moeda, não é preciso fazer esse teste em cada invocação recursiva da função. Seria mais correcto se apenas se fizesse o teste uma vez, aplicando depois uma função de multiplicação entre o valor e o preço de cada par:

convPrecos :: TabPrecos -> Cotacoes -> Moeda -> TabPrecos
convPrecos [] _ _ = []
convPrecos _ [] _ = []
convPrecos l ((md,vl):xc) moeda | md == moeda = map (\(pt,pr) -> (pt,pr*vl)) l
			| otherwise = convPrecos l xc moeda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora podiam dar 1 ajuda com a outra pergunta?? estou a tentar resolver mas nao consigo perceber :s

precosMultiMoeda :: TabPrecos -> [Moeda] -> Cotacoes -> [(Produto,[(Moeda,Preco)])]
precosMultiMoeda t m c = map fun t
	where fun (n,p) = (n,aux p m c)

E pa apresentar a definição e o tipo de aux.

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens que olhar para o facto de que aux recebe como 1º parâmetro um 'p'. Este p é o 2º elemento do par (n,p), sendo que esse par vem da lista t, ou seja, dum TabPrecos, logo esse par é do tipo (Produto,Preco), logo p será do tipo Preco. O m será uma lista de Moedas e o c as Cotacoes. O aux é utilizado para construir o 2º elemento do par resultante da função fun, logo vai construir uma lista de (Moeda,Preco). Depois o que ela faz é, para cada moeda existente, criar uma lista de pares (Moeda,Preco), onde esse Preco é obtido multiplicando o Valor da moeda pelo Preco:

aux :: Preco -> [Moeda] -> Cotacoes -> [(Moeda,Preco)]
aux p m c = map (\md -> aux2 p md c) m

aux2 :: Preco -> Moeda -> Cotacoes -> (Moeda,Preco)
aux2 p m (c:cs) | m == fst c = (m,p*snd c)
	| otherwise = aux2 p m cs

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para nao estar a abrir outro topico faco a pergunta aqui:

Esta e o exercicio era que tinha que fazer no exame, mas nao consegui por a funcionar :S Nao da como eu fiz?

A funcao soma 1 numero a todos os elementos de uma arvore de inteiros

data Tree a = Empty | Node a (Tree a) (Tree a)

somaNum :: Int -> Tree Int -> Tree Int
somaNum n Empty = Empty
somaNum n (Node a e d) = Node (a+n) (somaNum n e) (somaNum n d)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para nao estar a abrir outro topico faco a pergunta aqui:

Esta e o exercicio era que tinha que fazer no exame, mas nao consegui por a funcionar :S Nao da como eu fiz?

A funcao soma 1 numero a todos os elementos de uma arvore de inteiros

data Tree a = Empty | Node a (Tree a) (Tree a)

somaNum :: Int -> Tree Int -> Tree Int
somaNum n Empty = Empty
somaNum n (Node a e d) = Node (a+n) (somaNum n e) (somaNum n d)

Qual é o problema que a maneira como tu fizeste tem?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Qual é o problema que a maneira como tu fizeste tem?

eu tentei por a correr no pc, mas nao deu

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu tentei por a correr no pc, mas nao deu

E estás à espera que nós adivinhemos o que é que "nao deu"?

Se não compilou, qual foi o erro que deu? Se não produziu o resultado esperado, o que é que falhou? O que é que "nao deu"?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E estás à espera que nós adivinhemos o que é que "nao deu"?

Se não compilou, qual foi o erro que deu? Se não produziu o resultado esperado, o que é que falhou? O que é que "nao deu"?

Esquece ja da.

Tinha que por o deriving Show no data type.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora