F#数组的累积产品

时间:2014-05-06 09:46:51

标签: f#

使用F#,我想计算没有任何循环的数组的累积乘积。第一个想法是使用Array.fold和Array.map,但我不知道如何使用它们。你有什么建议?或peharps使用递归函数?非常感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

如果您需要所有元素的产品,您可以使用折叠:

> let a = [|1;2;3;4;5|];
> a |> Array.fold (*) 1;;

val it : int = 120

如果您需要中间(累积)结果,可以使用scan。扫描获取数组中的每个元素,并将一个函数(在这种情况下为产品)应用于元素和先前的累积结果。从累加器的值1开始,我们得到:

> a |> Array.scan (*) 1;;

val it : int [] = [|1; 1; 2; 6; 24; 120|]

答案 1 :(得分:2)

您可以使用Array.scan

let products = arr |> Array.scan (*) 1;;

答案 2 :(得分:1)

其他人已经给出了很好的答案,只是一般性评论。您的陈述"或者可能是递归函数"通常没必要。大约95%的时间,您可以使用折叠代替。如果你需要一个非标准的迭代顺序,那么递归函数就是你要去的地方。

除此之外,不考虑如何一次完成整个操作,即如何处理您的案例中的数字列表,而只考虑如何为一个项目执行此操作。

从那你得到你,例如需要将项目与累加器相乘。因此,在这种情况下,您不再需要递归,因为使用折叠,您可以在迭代本身上进行抽象。

答案 3 :(得分:0)

如果你想使用tail递归函数来完成这项工作。你可能想尝试类似的东西:

let l = [1;2;3;4;5]

let product lst = 
    let rec pTR acc = function
        | [] -> acc
        | h::t -> pTR (h * acc) t
    pTR 1 lst

product l