在递归函数期间保持值

Thi*_*ira 0 recursion haskell

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

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

函数类型是这样的:

f :: [Int] -> Int
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗?

Ry-*_*Ry- 5

由于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)