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