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

nana91

Problemas com classicos

Mensagens Recomendadas

nana91    0
nana91

Olá a todos, preciso de dicas para estes problemas:

1- Preciso de construir uma função combs que calcula as combinações, por exemplo:

combs 4 2 => combs 3 2 + combs 3 1 => (combs 2 2 + combs 2 1) + comb 3 1 => (1 + combs 2 1) + combs 3 1 => (1 + (combs 1 1 + combs 1 0) + combs 3 1 => (1 + (1 + 1)) + combs 3 1 => (1 + 2) + combs 3 1 => 3 + combs 3 1 => 3 + (combs 2 1 + combs 2 0) => 3 + ((combs 1 1 + combs 1 0) + combs 2 0) => 3 + ((1 + combs 1 0) + combs 2 0) => 3 + ((1 + 1) + 1 => 3 + (2 + 1) => 3 + 3 => 6.

Ou seja

Main> combs 4 2

6

2- Dda uma lista constrói uma outra em que o primeiro elemento e último são iguais aos da primeira lista e os outros são a soma de elementos adjacentes esta lista, pela mesma ordem.

Main> s [4,5,6,7]

[4,9,11,13,7]

:confused:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

A 1ª é uma função tipicamente recursiva, cuja definição segue o mesmo estilo de funções como a função de Fibonacci ou factorial. Tens os casos base, que são facilmente identificáveis com esse exemplo, e depois tens o caso recursivo, também fácil de identificar.

A 2ª já sabes como obter o 1º e último elemento (head, last). Para os outros basta percorreres a lista e ires somando 2 a 2 (o 4 com o 5, o 5 com o 6, o 6 com o 7).

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

Na 2ª não é preciso o head nem o last, simplesmente é percorrer a lista com um parâmetro extra que será o último elemento percorrido, inicialmente será o valor 0.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Olá o que fariam neste exercicio:

programar uma função removeMultiples que retira de uma lista dada todos os múltiplos de um número dado.

Main> removeMultiples 3 [1..10]

[1,2,4,5,7,8,10]

:)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

Olá o que fariam neste exercicio:

programar uma função removeMultiples que retira de uma lista dada todos os múltiplos de um número dado.

Main> removeMultiples 3 [1..10]

[1,2,4,5,7,8,10]

:)

Isso será usar a função filter, que se não me engano, já a usaste várias vezes.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Preciso de mais uma dica (ou um exemplo parecido  :-[) pois estou um pouco ás aranhas, tenho o seguinte exercicio:

Se aplicarmos a função s (eu já expliquei a função s neste tópico) sucessivamente, construímos um trapézio de números, isto é, a uma lista de listas de números, em que o comprimento de cada lista é superior em uma unidade ao da lista anterior.

Ex's:

Main> trapezium [2,3,5] 4

[[2,3,5],[2,5,8,5],[2,7,13,13,5],[2,9,20,26,18,5]]

Main> trapezium [] 6

[[],[],[],[],[],[]]

Main> trapezium [1,2,3] 0

[]

:confused:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Baderous    31
Baderous

É só ires usando a função s para a aplicares sobre a lista que passas como argumento enquanto vais diminuindo o valor do 2º argumento até chegar a 0. Neste processo, vais adicionando o resultando de usares a função s sobre a lista à lista final. É uma função recursiva como muitas outras que já deves ter feito.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Olá pessoal. No exercicio 1 já tenho tudo feito, mas dá-me erro quando testo a função.

combinations :: Int -> Int -> Integer
-- combinations n k =  product [1..n] `div` ( product [1..k] * product [1..(n-k)])
combinations n k = product [(fromIntegral k+1)..fromIntegral n] `div` product [1..fromIntegral (n-k)]

combs :: Integer -> Integer -> Integer
combs n k = (combinations (n-1) k) + (combinations (n-1) (k-1))

Mas depois dá-me o seguinte erro:

Type error in application

*** Expression    : combinations (n - 1) (k - 1)

*** Term          : k - 1

*** Type          : Integer

*** Does not match : Int

Onde é que acham que estou a errar, corrijam-me s.f.f.f

:D

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

Porque tens a usar Ints na assinatura, se a função está a receber Integers?

Diria que teres Ints está a complicar e torna o uso do fromIntegral desnecessário.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Olá o meu professor exige que eu tenha a assinatura da função combinations assim:

combinations :: Int −> Int −> Integer

Já não sei o que faça para alterar esta função :'(

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

Olá o meu professor exige que eu tenha a assinatura da função combinations assim:

Então diz ao teu prof, que ele é um grande def. Não estou a brincar, torna o problema estupidamente complexo.

O teu prob está aqui:

combs :: Integer -> Integer -> Integer
combs n k = (combinations (n-1) k) + (combinations (n-1) (k-1))

Porque o 'n' e o 'k' são Integer, mas a função combinations está a espera de Ints.

Portanto ao passar os parâmetros para combinations tens de primeiro converter para Int (com o fromIntegral).

Depois dentro do combinations, tens de converter os Ints novamente para Integer.

Resumindo, uma verdadeira salgalhada...

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Que raiva não conseguir fazer isto, agora pus a função assim:

combinations :: Int -> Int -> Integer
-- combinations n k =  product [1..n] `div` ( product [1..k] * product [1..(n-k)])
combinations n k = product [(fromIntegral k+1)..fromIntegral n] `div` product [1..fromIntegral (n-k)]

combs :: Integer -> Integer -> Integer
combs n k = fromIntegral (combinations fromIntegral (n-1) k) + fromIntegral (combinations fromIntegral (n-1) (k-1))

Eu sei que está pessima, pois agora dá-me este erro:

Type error in application

*** Expression    : combinations fromIntegral (n - 1) (k - 1)

*** Term          : combinations

*** Type          : Int -> Int -> Integer

*** Does not match : a -> b -> c -> d

Digam-me o que posso modificar para torná-la útil para o prof  :wallbash:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

Ainda falta alguns fromIntegral, e também tens uns a mais :(

combinations :: Int -> Int -> Integer
combinations n k = product [fromIntegral (k+1) .. fromIntegral n] `div` product [1..fromIntegral (n-k)]

combs :: Integer -> Integer -> Integer
combs n k = (combinations (fromIntegral (n-1)) (fromIntegral k)) + (combinations (fromIntegral (n-1)) (fromIntegral(k-1)))

Que pode ser simplificado para:

combinations :: Int -> Int -> Integer
combinations n k = product [k'+1..n'] `div` product [1..n'-k']
  where n' = fromIntegral n
        k' = fromIntegral k

combs :: Integer -> Integer -> Integer
combs n k = (combinations (n'-1) k') + (combinations (n'-1) (k'-1))
  where n' = fromIntegral n
        k' = fromIntegral k

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Olá pessoal podiam ajudar-me no exercico 2, podem dar-me um exemplo parecido, estou mesmo cansada de tentar e sair tudo errado. Também estou aflita nestes:

3- Se, partindo de uma lista inicial, não vazia, aplicarmos a função s sucessivamente, construímos um trapézio de números. Chamamos informalmente “trapézio de números” a uma lista de listas de números, em que o comprimento de cada lista é superior em uma unidade ao da lista anterior. Programemos então uma função trapezium que dada uma lista de inteiros Int e um inteiro Int calcula uma lista de listas de inteiros Int, com tantas listas quantas as indicadas pelo segundo

argumento e em que cada uma é obtida da anterior pela função s. Por exemplo, trapezium [2,3,5] 4 vale [[2,3,5],[2,5,8,5],[2,7,13,13,5],[2,9,20,26,18,5]], trapezium [] 6 vale [[],[],[],[],[],[]], trapezium [1,2,3] 0 vale [].

4- Programando a função pascal, com um argumento de tipo Int, e que constrói o triângulo de Pascal com o número

de linhas indicado pelo argumento. Por exemplo: pascal 5 vale [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]].

Dicas please, exemplos parecidos, sites com exercicios resolvidos onde eu possa tirar exemplos.

:thumbsup:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
nana91    0
nana91

Na 2ª não é preciso o head nem o last, simplesmente é percorrer a lista com um parâmetro extra que será o último elemento percorrido, inicialmente será o valor 0.

Poderás explicar-me melhor como fazer ...

Eu tenho esta função que foi discutida noutro tópico, mas não sei modificá-la de modo que o head e o last se mantêm.

rec_sum [] = []
rec_sum (x:xs) = x:[sum $ take len xs | len <- [1..length xs]]

:thumbsup:

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Betovsky    2
Betovsky

Mas o que eu estava a dizer era para descartar o head e last. Usares só atrapalha para a resolução do problema.

Imagina uma resolução mais simplificada do problema. Imagina que queres fazer uma função que dado 2 parâmetros, um inteiro e uma lista de inteiros, soma o inteiro a cada elemento da lista.

fun :: Int -> [int] -> [int]
-- fun 2 [2,3,4,5] devolve [4,5,6,7]

Consegues resolver isto certo?

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 a nossa Política de Privacidade