F#数组的累积乘积
使用F#,我想计算没有任何循环的数组的累积乘积。第一个想法是使用Array.fold和Array.map,但我不知道如何使用它们。你有什么建议?还是使用递归函数的peharps?非常感谢您的帮助。您可以使用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
数组。扫描:
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,很安静,谢谢你的评论,丹尼尔