给定一个Array
,我需要计算最大元素的索引(假设它是唯一的)。
我目前的尝试是:
maxIndex' :: (Ix i, Ord a) => Array i a -> [i] -> i -> a -> i -> a -> i
maxIndex' arr ids index element maxIndex maxElement
| length ids == 1 && element > maxElement = index
| length ids == 1 && element <= maxElement = maxIndex
| element > maxElement = maxIndex' arr (tail ids) (head ids) (arr ! head ids) index element
| otherwise = maxIndex' arr (tail ids) (head ids) (arr ! head ids) maxIndex maxElement
maxIndex :: (Ix i, Ord a) => Array i a -> i
maxIndex arr = maxIndex' arr (tail (indices arr)) firstIndex firstMaximum firstIndex firstMaximum
where
firstIndex = head (indices arr)
firstMaximum = arr ! firstIndex
然而,当前的实现是不正确的:
print (maxIndex (array (False,True) [(False,54),(True,104)])) -- Prints False.
print (maxIndex (array (False,True) [(True,104),(False,54)])) -- Prints False.
我错过了什么
1条答案
按热度按时间ltqd579y1#
你的
maxIndex
函数很复杂,说实话我不明白你在做什么。一般来说,如果你做了很多head
,tail
和显式递归,那么已经出了问题。最简单的方法是将数组转换为一个由(index, element)
对组成的链表,通过对中的第二个元素进行比较,得到第一个元素(index
)。