Ir para o conteúdo
luchhozito

duvida recursividade

Mensagens Recomendadas

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
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...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
luchhozito    0
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 ??

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
luchhozito    0
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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
luchhozito    0
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 ....

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jony17    0
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jony17    0
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)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Rui Carlos    311
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"?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jony17    0
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.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade