Jump to content

Como pegar os indices de uma lista e não valores?


crislanio_macedo
 Share

Recommended Posts

Como fazer para pegar os indices da maior permutação gerada?

no caso a função add adiciona um valor a lista somando esse valor a cada indice da lista

a função listacc recebe uma lista e soma o 1° valor da lista a cada valor da lista.

Eu queria uma forma de retornar por exemplo a listacc [1,2,3,4] retorna [1,3,6,10] neste exemplo o maior valor gerado foi o 10 que fio gerado através de todos os valores somados, queria ao inves de retornar o 10 retornasse os índices que geraram este valor !

Ex: para

*Main> listacc [-1,-2,3,-4]
[-1,-3,0,-4]

retornaria somente uma lista que foi gerada com o maior valor, neste exemplo o zero 0 é o maior valor, ele foi gerado através da combinação de -1 + -2 + -3, logo queria o retorna os valores

[-1 ,-2 ,-3]

me ajudem , grato

*Main> listacc [1,2,3,4]
[1,3,6,10]


add :: Num a => a -> [a] -> [a]
add z [] = []
add z (head:tail) = head+z :add (z+head) tail

listacc :: (Num a) => [a] -> [a]
listacc [] =[]
listacc ac@(u:us) = u : add u (us)

Edited by thoga31
Correcção das tags
Link to comment
Share on other sites

Um conselho: não uses nomes de funções para definir objectos, a leitura do código torna-se confusa. 😉

Vê se esta função te pode dar uma ideia de como podes fazer o que pretendes:

Prelude> takeWhile (<5) [1..]
[1,2,3,4,5]

Podes fazer uma função que pegue nas duas listas - a de origem e a de soma acumulada (não se chamam permutações!) -, e recolhe os valores da primeira lista enquanto não chegar ao máximo da segunda. Ou então usar a própria função listacc como argumento.

Prelude> f (listacc) [-1,-2,3,-4]  {- vai aplicar a função listacc à lista, e vai retornar um tuplo em que
                                     o primeiro elemento é o resultado da aplicação da função, e o segundo
                                     é o pedaço da lista original que deu origem ao maior -}
([-1,-3,0,-4], [-1,-2,3])

Prelude> g [-1,-2,3,-4] [-1,-3,0,-4]  -- solução possivelmente mais simples
[-1,-2,3]

Sugestão para a função "g":

g xs ys = apply xs ys (max ys)
 where
   apply _ [] _ = []
   apply [] _ _ = []
   apply (b:bs) (c:cs) m =  -- se c == m então adiciona b e termina.
Edited by thoga31

Knowledge is free!

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.