我试图在阵列中获得4个相邻数字的最大乘积,这就是我现在所得到的:
let max4 line =
let rec loop acc = function
|a :: b :: c :: [] -> acc
|a :: b :: c :: d :: tl -> loop (max(acc, a*b*c*d)) tl
|_ -> 0
loop 0 line
Run Code Online (Sandbox Code Playgroud)
我得到一个关于这max(,)句话的编译错误:
错误FS0001:类型不匹配.期待'a但给定'a*'b - >'a*'b当统一''a'和'a*'b - >'a*'b'时,结果类型将是无限的
有人知道这段代码有什么问题吗?(或其他解决方案)
作为使用显式递归的替代方法,您还可以使用现有的F#库函数来解决此问题.这就是大多数F#数据处理的编写方式,但学习如何手动编写递归函数总是好的(因为有时候需要它们).
因此,为了完整性,这里有一种方法可以使用现有函数更加声明地解决问题:
let max4 line =
line |> Seq.windowed 4
|> Seq.map (Seq.reduce (*))
|> Seq.max
Run Code Online (Sandbox Code Playgroud)
第一行将列表转换为4元素数组(窗口)的序列.然后Seq.map将其传递给窗口,使窗口成为元素的乘积.要做到这一点,我正在使用Seq.reduce指定函数减少序列(在本例中为窗口),这里是(*)运算符.最后,要找到产品的最大元素,可以使用Seq.max函数.