使用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 | ]' –