1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.
  2. Informação: Pela 0:30 desta Sexta-feira (9 de Dezembro, 23:30 de Quinta-feira nos Açores) o Fórum e restantes sites da ZWAME vão estar offline para manutenção durante cerca de 1h30.
    Se necessário faremos actualizações via Twitter e Facebook.
    Remover anúncio

Funcao [Haskell]

Discussão em 'Programação' iniciada por nram, 5 de Novembro de 2008. (Respostas: 5; Visualizações: 744)

  1. nram

    nram Power Member

    Eu tenho uma lista de (nomes|Numeros) , e na função tenho que retirar da lista os nomes com o numero menor... se houver 2 numeros menores iguais, apagar os 2 nomes... comecei por fazer isto..

    Código:
    type Nome = String
    type Numero = Int
    type Jogadore = (Nome,Numero)
    type Jogador = [Jogadore]
    
    remMenor :: Jogador -> Jogador
    remMenor [] = [] 
    remMenor [(a,b)] = []
    remMenor ((a,b):xs) = if (verMenor ((a,b):xs) == b) then remMenor xs else ((a,b):(remMenor xs))
    
    verMenor :: Concerto -> Int
    verMenor [] = []
    verMenor ((a,b):xs) | (b < snd (verMenor xs)) = b 
                             | otherwise = verMenorDur xs
    mas não dá.. de certeza... preciso que a função de verificar o mais pequeno fique numa variável para não fazer sempre essa função.

    Cumprimentos
     
    Última edição: 5 de Novembro de 2008
  2. Baderous

    Baderous Banido

    Tu tens isto:

    Código:
    type Nome = String
    Type Numero = Int
    type Jogador = (Nome,Numero)
    Isto não é uma lista, é um par de elementos.
     
  3. nram

    nram Power Member

    independentemente disso... não é isso o que me está a dar mal... eu quero uma função que chame outra apenas uma vez para saber o menor número da lista, e vou precisar da recursiva de uma para montar a lista.. mas não sei fazer / ou não me lembro... :X
     
  4. Baderous

    Baderous Banido

    Código:
    remMenor :: Jogador -> Jogador
    remMenor [] = []
    remMenor [_] = []
    remMenor ((a,b):(c,d):xs) | b<d = (c,d):(remMenor ((a,b):xs))
                  | otherwise = (a,b):(remMenor ((c,d):xs))
    Basta ir comparando 2 a 2. O menor vai ficando na lista inicial, enquanto que os outros passam para a a lista resultante.
     
  5. nram

    nram Power Member

    mas imagina que aparece a seguinte lista:

    [("nome1",7),("nome2",6),("nome3",9),("nome4",6)]

    Ele só vai remover um deles ( ou o nome2 ou nome4)... por esse método!
     
    Última edição: 5 de Novembro de 2008
  6. Baderous

    Baderous Banido

    A solução que encontrei passa por ordenar de acordo com o 2º elemento do par de cada elemento, essa tua lista de jogadores. Depois basta-me eliminar dessa lista todos aqueles cujo 2º elemento é o menor. Basicamente, aquilo que fiz foi:

    l1 = [("andre",3),("Miguel",9),("joao",3)] :: Jogador

    Passa para:

    l1 = [("joao",3),("andre",3),("Miguel",9)] :: Jogador

    E por fim:

    l1 = [("Miguel",9)] :: Jogador

    Código:
    remMenor' l = let x = snd $ head $ isort l
               in filter (\y -> snd y /= x) l
    
    isort [] = []
    isort (h:t) = insere h (isort t)
    
    insere x [] = [x]
    insere x (y:ys) | snd x <= snd y = x:y:ys
            | otherwise = y:(insere x ys)
    A função isort representa o algoritmo de insertion sort, adaptado a uma lista de pares (mais concretamente, a função insere é que está adaptada).
     

Partilhar esta Página