Я написал задачу подсчета изменений из sicp на F# следующим образом.
let count_change amount =
let first_denomination kinds_of_coins =
match kinds_of_coins with
|1->1
|2->5
|3->10
|4->25
|5->50
let rec cc amount kinds_of_coins =
match (amount,kinds_of_coins) with
|(0,_) -> 1
|(i,j) when i<0 || j=0 -> 0
|(_,_) ->
[cc amount (kinds_of_coins-1) +
cc (amount - (first_denomination kinds_of_coins)) kinds_of_coins]
|> List.fold (+) 0
cc amount 5
Я хотел распараллелить длительную задачу, и это то, что я сделал
let rec cc amount kinds_of_coins =
match (amount,kinds_of_coins) with
|(0,_) -> 1
|(i,j) when i<0 || j=0 -> 0
|(_,_) ->
[async {return cc amount (kinds_of_coins-1)
+ cc (amount - (first_denomination kinds_of_coins)) kinds_of_coins}]
|> Async.Parallel |> Async.RunSynchronously |> Array.fold (+) 0
Это работает медленнее первой реализации на несколько порядков. Не могли бы вы рассказать мне, как я мог бы распараллелить это более эффективно.