crislanio_macedo Posted March 22, 2014 Report Share Posted March 22, 2014 (edited) 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 March 22, 2014 by thoga31 Correcção das tags Link to comment Share on other sites More sharing options...
thoga31 Posted March 22, 2014 Report Share Posted March 22, 2014 (edited) 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 March 22, 2014 by thoga31 Knowledge is free! Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now