Jump to content

Listas


leorsilva
 Share

Recommended Posts

Estou aprendendo haskell e me deparei com um problema em relação a listas... como faço para saber, se é que é possível, em qual índice de uma lista estou... tipo, tendo uma lista [8,1,3,7] quero ter uma lista que contenha apenas os dígidos em índicies ímpares, o que daria [8,3].

Link to comment
Share on other sites

Usar o !! é bastante ineficiente.

Uma forma fácil era percorreres a lista consumindo 2 elementos de cada vez.

"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

Link to comment
Share on other sites

2 questões: 1 - como se faz essa verredura de mais de um valor? 2 - se eu percorrer de 2 em 2 ñ estarei pegando os índices pares? o que gostaria e de ter os valores de índices ímpares... como coloquei no exemplo... se entro com a lista [2,4,6,8] a resposta sair [2,6]

Link to comment
Share on other sites

o exércício que estou tentando resolver é o seguinte:

"Um número é dito careta, se a soma de seus dígitos ímpares é igual à soma de seus dígitos em posições ímpares. Crie uma função que fornecido um número diga se ele é careta."

tenho o seguinte feito até o momento:

careta :: Int -> String

careta x = if sum(listaImpar(x)) == sum(listaPImpar(x))

          then "Careta"

          else "Nao e careta"

listaImpar 0 = []

listaImpar x = if(mod (mod x 10) 2) /= 0

              then listaImpar(div x 10) ++ [mod x 10]

              else listaImpar(div x 10)

ou seja... peguei o número digitado e tranformei em uma lista de Int somente com os dígitos ímpares e somei esta lista... Agora ñ tenho idéia como fazer para que com esse número eu gere uma lista apenas com os números que estão nas posições ímpares para depois somar essa lista e ver se é igual a primeira lista que criei.

Link to comment
Share on other sites

só para dar uma clareada em cima do enunciado do problema que postei... um número que seria chamado de careta pelo enunciado é o núemro 8137... pois a soma de seus dígitos ímpares (1 ,3 ,7) é 11 e a soma de seus dígitos e posições ímpares (8, 3) tb é 11

Link to comment
Share on other sites

A ideia é a mesma fazes uma funcao que :

-> Começa em n (n = 1) e vais somando este valor com a  chamada desta funcao recursivamente mas agora n+2;

-> Caso de paragem quando n > x , em que x é o valor que pretendes ver se é careta

Acho que isso não dá certo pq ñ vou buscar um valor e sim quero saber se um valor é... tenho que somar seus digistos impares e soma seus digitos em posição impares e ver se essas somas são iguais.

Link to comment
Share on other sites

essa lógica não faz o que procurava não... ñ quero dar um número e ver se ele é igual a outro ñ...

consegui resolver... estou postando aqui a minha resolução.

careta :: Int -> String
careta 0 = "Nao e careta"

careta x = if sum(listaImpar(x)) == sum(listaPImpar(x))
           then "Careta"
           else "Nao e careta"

listaImpar 0 = []
listaImpar x = if(mod (mod x 10) 2) /= 0
               then listaImpar(div x 10) ++ [mod x 10]
               else listaImpar(div x 10)

listaPImpar 0 = []
listaPImpar x = if mod (length (lista(x))) 2 /= 0
                then listaPImpar(div x 10) ++ [mod x 10]
                else listaPImpar(div x 10)

lista 0 = []
lista x = lista(div x 10) ++ [mod x 10] 

exemplo: careta 8137... crio uma lista só com os dígitos impares(1,3,7) e crio uma lista só com os valores quando o length é impar, pegando o último valor, que será de índice ímpar... depois comparo a soma das 2 listas...

Link to comment
Share on other sites

consegui resolver... estou postando aqui a minha resolução.

Tens várias coisas que podes melhorar aí.

Primeiro não precisas de usar o operador ( ++ ). Podes usar antes o operador ( : ). Já que a adição é comutativa. E usares o ( : ) é bem mais eficiente que o ( ++ ).

Depois para validares se um dado digito é par, podes simplesmente fazer logo mod do número pelo 2, fazeres primeiro mod por 10 é irrelevante.

Na função listaPImpar em vez de estares a cada passagem a gerar a lista para saber o índice do digito.

* Podes usar uma parâmetro extra que vai alternando entre "é impar", "é par".

* Outra é gerares primeiro a lista (apenas uma vez) e depois percorrer de forma normal.

"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

Link to comment
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
 Share

×
×
  • Create New...

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.