使用F#,我想计算没有任何循环的数组的累积乘积。第一个想法是使用Array.fold和Array.map,但我不明白我可以如何使用它们。你有什么建议?或使用递归函数peharps?非常感谢您的帮助。F#数组的累积积
F#数组的累积积
回答
如果你需要的所有元素的产品,你可以使用折叠确实:
> let a = [|1;2;3;4;5|];
> a |> Array.fold (*) 1;;
val it : int = 120
如果需要中间(累计)的结果,你可以使用scan
。扫描获取数组中的每个元素并将一个函数(本例中为product)应用于该元素以及之前的累计结果。与蓄能值1开始,我们得到:
> a |> Array.scan (*) 1;;
val it : int [] = [|1; 1; 2; 6; 24; 120|]
您可以使用Array.scan
:
注意,如果'arr'长度为'N','products'的长度是'N + 1' - 第一个元素是1 – torbonde
谢谢李,与扫描,它很安静简单 –
其他已经给了很好的回答,只是一般性发言。你的陈述“或者一个递归函数”通常是不必要的。大约95%的时间,你可以使用折叠。如果您需要非标准的迭代顺序,那么递归函数是要走的路。
除此之外,不考虑如何一次完成整个操作,即如何处理您的案例中的数字列表,而只是考虑如何处理一个项目。
从那你你得到需要将项目与累加器相乘。因此,在这种情况下,您不再需要递归,因为您在迭代本身上抽象了折叠。
非常感谢Daniel对您的评论 –
如果您想使用尾递归函数来完成这项工作。你可能会想尝试做某事类似:
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
- 1. F#累积随机数序列
- 2. 积累在值的元组
- 3. boost mpl积分型积累
- 4. SQL累积计数
- 5. 组阵列和累积值
- 6. 的多维数组累积和在Javascript
- 7. 使用OpenCL的累积数组求和
- 8. 一组值的累积分布函数
- 9. 积累错误
- 10. 累积合计
- 11. 累积和
- 12. Reserved.ReportViewerWebControl.axd Cookie累积
- 13. 累积计算
- 14. 累积平均
- 15. Cassandra sstables累积
- 16. 累积总和
- 17. 累积相加
- 18. 积累套
- 19. SQL累积值
- 20. 累积差异
- 21. 递归积累
- 22. SQL中的累积计数
- 23. 爪哇 - 数组列表累积
- 24. 积累numpy数组只为一列
- 25. 累积关联数组值PHP
- 26. Postgres:array_agg抛出'无法累积空数组'
- 27. Angularjs过滤器累积数组
- 28. Jquery数学和累积值
- 29. 累积频率计数 - MATLAB
- 30. 如何积累数据集?
当然,你也可以用'fold'(或'unfold',列表和序列!)来实现你自己的'scan'。 – Mau
我完全忘记了扫描。非常感谢你 –
在这种情况下,你也可以使用更简单的* Array.reduce *函数作为* Array.fold *的特殊形式:'Array.reduce(*)[| 1; 2; 3; 4; 5 | ]' –