Haskell:数组中最大元素的索引

gojuced7  于 2023-05-23  发布在  其他
关注(0)|答案(1)|浏览(107)

给定一个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.

我错过了什么

ltqd579y

ltqd579y1#

你的maxIndex函数很复杂,说实话我不明白你在做什么。一般来说,如果你做了很多headtail和显式递归,那么已经出了问题。最简单的方法是将数组转换为一个由(index, element)对组成的链表,通过对中的第二个元素进行比较,得到第一个元素(index)。

import Data.Array
import Data.Function (on)
import Data.List (maximumBy)

-- Notice maximumBy is partial
maxIndex = fst . maximumBy (compare `on` snd) . assocs 
--         |     |                              |- the list of (index, array_element)
--         |     |- maximum using a custom comparision function. In this case, compare on second element in the tuple
--         |- get the first element of the tuple
main = do  
  let arr = array (False,True) [(False,54),(True,104)]
  print $ maxIndex arr

相关问题