【问题标题】:F# all permutations of C# classF# C# 类的所有排列
【发布时间】:2011-04-11 23:58:57
【问题描述】:

我有一个 C# 类 MyClass。

我需要实现 f# 方法返回所有 IList 中项目的可能排列

问题是 MyClass 包含一个方法 bool CheckOrder(IList 前辈) 如果 MyClass 的实例可以放在实例之后的排列中 参数中的 MyClass。否则此方法返回 false。

请,谁能告诉我如何实现正确的 F# 函数。

更新: 考虑到我的 C# 类有方法,您能否概述方法测试的 F# 代码:bool CheckOrder(IList 前辈)

【问题讨论】:

标签: f# permutation


【解决方案1】:

您的 CheckOrder 方法需要 IList<MyClass>,因此我们应该在 F# 中使用数组,因为数组实现了 IList 接口。

对于置换候选中的每个元素,我们需要检查它在数组中的所有前辈是否合法。对我来说,这看起来像是 fold 操作的工作,其中 fold 的状态参数是“到目前为止的数组”和布尔成功标志的元组。

let checkPermutation (permutation:MyClass[]) =
   let prefix, success =
      permutation
      |> Array.fold (fun (prefix:MyClass[], success) element ->
                        if not success then
                           (Array.empty, false) // once failed, the result is false
                        else
                           (Array.append [|element|] prefix, element.CheckOrder prefix)
                    )
                    (Array.empty, true)
   success

Array.append 可能效率很低。如果这太慢,您应该考虑改用ResizeArray(与C# List 相同)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 2018-08-01
    • 1970-01-01
    相关资源
    最近更新 更多