在Haskell中,我正在尝试解决一个问题,我需要一个接收整数列表的函数,并返回两个相邻数字的最大乘积。
示例:f [5,6,1,3,9]将返回30,即5和6的乘积
函数类型是这样的:
f :: [Int] -> Int
我想解决这个问题,使用递归来迭代列表,使用这样的模式获取2个头元素:(x1:x2:xs)
问题是,如果当前产品比上一个产品大,我不知道如何保持产品价值比较。
有什么想法吗?
答案 0 :(得分:5)
由于Haskell列表是惰性的,因此您可以使用基于列表的方法解决此问题,而不是明确保持最大值而不会降低效率。从原始列表开始:
> let f x = x
> f [5,6,1,3,9]
[5,6,1,3,9]
通过zip
获取一个对列表,使用左移列表ping整个列表:
> let f x = zip x (tail x)
> f [5,6,1,3,9]
[(5,6),(6,1),(1,3),(3,9)]
使用相关函数zipWith
来获取产品而不是成对:
> let f x = zipWith (*) x (tail x)
> f [5,6,1,3,9]
[30,6,3,27]
并从该列表中获取maximum:
> let f x = maximum (zipWith (*) x (tail x))
> f [5,6,1,3,9]
30