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