在递归函数期间保持值

时间:2017-10-24 21:59:24

标签: haskell recursion

在Haskell中,我正在尝试解决一个问题,我需要一个接收整数列表的函数,并返回两个相邻数字的最大乘积。

示例:f [5,6,1,3,9]将返回30,即5和6的乘积

函数类型是这样的:

f :: [Int] -> Int

我想解决这个问题,使用递归来迭代列表,使用这样的模式获取2个头元素:(x1:x2:xs) 问题是,如果当前产品比上一个产品大,我不知道如何保持产品价值比较。

有什么想法吗?

1 个答案:

答案 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