f#获取数组中4个相邻数字的乘积

Omu*_*Omu 0 .net f#

我试图在阵列中获得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'时,结果类型将是无限的


有人知道这段代码有什么问题吗?(或其他解决方案)

Tom*_*cek 5

作为使用显式递归的替代方法,您还可以使用现有的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函数.