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

luchhozito

duvida recursividade

Recommended Posts

luchhozito

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.

Share this post


Link to post
Share on other sites
Betovsky

(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...


"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
luchhozito

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 ??

Share this post


Link to post
Share on other sites
luchhozito

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.

Share this post


Link to post
Share on other sites
Baderous

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

Share this post


Link to post
Share on other sites
luchhozito

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

Share this post


Link to post
Share on other sites
Baderous

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

Share this post


Link to post
Share on other sites
jony17

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

Share this post


Link to post
Share on other sites
Baderous

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

Share this post


Link to post
Share on other sites
jony17

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)

Share this post


Link to post
Share on other sites
Rui Carlos

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?

Share this post


Link to post
Share on other sites
jony17

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

eu tentei por a correr no pc, mas nao deu

Share this post


Link to post
Share on other sites
Rui Carlos

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"?

Share this post


Link to post
Share on other sites
jony17

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.

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

×

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.