Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

luchhozito

[Resolvido]Funcao QuickSort

Mensagens Recomendadas

luchhozito

type Inscritos=[Aluno]
type Aluno=(Nome,Num,Curso)
type Nome=String
type Num=Integer
type Curso=String

Tenho esta função abaixo que tem como objectivo ordenar os Inscritos pelo numero (crescente).

ordenada :: Inscritos -> Inscritos						
ordenada ((a,b,c):xs) = ordenada (filter(\(_,b,_) (< xs)) ++ [(a,b,c)] ++ ordenada (filter(\(_,b,_) -> (>=b) xs))

mas está a dar um erro.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

A definição de quicksort é esta:

qsort [] = []
qsort (x:xs) = let mi = filter (<x) xs
	   mai = filter (>=x) xs
       in qsort mi ++ [x] ++ qsort mai

Vê lá o que é que estás a fazer mal.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
luchhozito

não estou a conseguir compilar. :confused:

ordenada :: Inscritos -> Inscritos						
ordenada [] = []
ordenada ((a,b,c):xs) = let mi = filter ((\(_,b,_) -> (<b)) xs)
			           mai = filter ((\(_,b,_) -> (>=b)) xs)
			      in ordenada mi ++ [(a,b,c)] ++ ordenada mai

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Estás a definir um tipo de dados para representar o número com uma palavra reservada: Num. Esta palavra representa uma classe de Haskell, não podes utilizar para dar nomes aos teus tipos.

Para além disso, tens aí uns parêntesis a mais no filter e a função < e >= têm tipo Ord a => a -> a -> Bool e da forma que estavas a fazer, o compilador inferia que o tipo era a -> Bool.

ordenada :: Inscritos -> Inscritos                                             
ordenada [] = []
ordenada ((a,b,c):xs) = let mi = filter (\(_,t,_) -> t<b) xs
                           mai = filter (\(_,t,_) -> t>=b) xs
                       in ordenada mi ++ [(a,b,c)] ++ ordenada mai 

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
luchhozito

Estás a definir um tipo de dados para representar o número com uma palavra reservada: Num. Esta palavra representa uma classe de Haskell, não podes utilizar para dar nomes aos teus tipos.

Para além disso, tens aí uns parêntesis a mais no filter e a função < e >= têm tipo Ord a => a -> a -> Bool e da forma que estavas a fazer, o compilador inferia que o tipo era a -> Bool.

ordenada :: Inscritos -> Inscritos                                             
ordenada [] = []
ordenada ((a,b,c):xs) = let mi = filter (\(_,t,_) -> t<b) xs
                           mai = filter (\(_,t,_) -> t>=b) xs
                       in ordenada mi ++ [(a,b,c)] ++ ordenada mai 

eishh... pois. obrigadao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
luchhozito

Utilizando o tipo do primeiro post.

type Inscritos=[Aluno]
type Aluno=(Nome,Num,Curso)
type Nome=String
type Num=Integer
type Curso=String

Objectivo: Calcular a lista de alunos de um dados curso ordenada por número.

Dão isto:

listagem :: Inscritos -> Curso -> [Num]
listagem t c = ordena (filter(==c) t)

Exercicio:

Apresente uma definição para a função ordena e apresenta o seu tipo

----- minha resolução ---



-- saca apenas os numeros
da_num :: Inscritos -> [Num]
da_num [] = []
da_num ((a,b,c):xs) = [b] ++ da_num xs

-- funcao ordena
ordena :: Inscritos -> [Num]
ordena [] = []
ordena t = da_num (ordenada t) 

-- ordenar por numero
ordenada :: Inscritos -> Inscritos                                           
ordenada [] = []
ordenada ((a,b,c):xs) = filter (\(_,t,_) -> t<b) xs ++ [(a,b,c)] ++ filter (\(_,t,_) -> t>=b) xs

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
AJBM

Utilizando o tipo do primeiro post.

type Inscritos=[Aluno]
type Aluno=(Nome,Num,Curso)
type Nome=String
type Num=Integer
type Curso=String

Objectivo: Calcular a lista de alunos de um dados curso ordenada por número.

Dão isto:

listagem :: Inscritos -> Curso -> [Num]
listagem t c = ordena (filter(==c) t)

Exercicio:

Apresente uma definição para a função ordena e apresenta o seu tipo

----- minha resolução ---



-- saca apenas os numeros
da_num :: Inscritos -> [Num]
da_num [] = []
da_num ((a,b,c):xs) = [b] ++ da_num xs

-- funcao ordena
ordena :: Inscritos -> [Num]
ordena [] = []
ordena t = da_num (ordenada t) 

-- ordenar por numero
ordenada :: Inscritos -> Inscritos                                           
ordenada [] = []
ordenada ((a,b,c):xs) = filter (\(_,t,_) -> t<b) xs ++ [(a,b,c)] ++ filter (\(_,t,_) -> t>=b) xs

Boas olha podes explicar me como e que esta funcao funciona?

Partilhar esta mensagem


Ligação 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. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.