F#数组的累积乘积

F#数组的累积乘积,f#,F#,使用F#,我想计算没有任何循环的数组的累积乘积。第一个想法是使用Array.fold和Array.map,但我不知道如何使用它们。你有什么建议?还是使用递归函数的peharps?非常感谢您的帮助。您可以使用数组。扫描: let products = arr |> Array.scan (*) 1;; 如果需要所有元素的乘积,可以使用fold: > let a = [|1;2;3;4;5|]; > a |> Array.fold (*) 1;; val it : int

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

您可以使用
数组。扫描

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

如果需要所有元素的乘积,可以使用fold:

> 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|]

其他人已经给出了很好的回答,只是一个一般性的评论。您的语句“或者可能是递归函数”通常是不必要的。大约95%的情况下,你可以用折叠来代替。如果需要非标准的迭代顺序,递归函数是一种可行的方法

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


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

如果您想使用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

当然,你也可以实现你自己的
scan
(或者
展开
,用于列表和序列!)。我完全忘记了scan。非常感谢您在这种情况下,您也可以使用更简单的Array.reduce函数作为数组的一种特殊形式。fold:
Array.reduce(*)[1;2;3;4;5 |]
注意,如果
arr
具有长度
n
产品将具有长度
n+1
-第一个元素是1。谢谢您,使用scan,很安静,谢谢你的评论,丹尼尔