【发布时间】:2012-03-05 10:37:26
【问题描述】:
编辑:我的措辞肯定不够清楚,但我正在寻找一个类似下面的函数,但不完全是。
给定一个列表,我希望能够找到列表中最大元素的索引
(所以,list !! (indexOfMaximum list) == maximum list)
我写了一些看起来非常有效的代码,尽管我觉得我在某个地方重新发明了轮子。
indexOfMaximum :: (Ord n, Num n) => [n] -> Int
indexOfMaximum list =
let indexOfMaximum' :: (Ord n, Num n) => [n] -> Int -> n -> Int -> Int
indexOfMaximum' list' currIndex highestVal highestIndex
| null list' = highestIndex
| (head list') > highestVal =
indexOfMaximum' (tail list') (1 + currIndex) (head list') currIndex
| otherwise =
indexOfMaximum' (tail list') (1 + currIndex) highestVal highestIndex
in indexOfMaximum' list 0 0 0
现在我想返回列表中最大 n 个数字的索引列表。
我唯一的解决方案是将前 n 个元素存储在一个列表中,并将 (head list') > highestVal 替换为 n-largest-so-far 列表中的比较。
感觉必须有比这样做更有效的方法,而且我也觉得我没有充分利用 Prelude 和 Data.List。有什么建议?
【问题讨论】:
标签: list haskell functional-programming