【问题标题】:Generate custom permutations with Erlang使用 Erlang 生成自定义排列
【发布时间】:2012-01-19 07:53:03
【问题描述】:

注意:这是我之前的排列 question 的“续集”问题。

我想在 Erlang 中生成列表的所有排列,但我想在将某些排列添加到堆栈或存储在任何地方之前过滤掉它们。

我将根据一些自定义的临时规则过滤掉排列(我们称它们为“过滤器”)。

换句话说,我想生成一个大列表(50-300 个元素)的排列列表,但我想在此过程中丢弃大部分生成的排列(我知道完整的数字排列的数量是 N!)。

steenslag 在 Ruby 中给了我一个不错的 solution

res = [1,2,3,4].permutation(3).reject do |perm|
  perm.first.even? #Filter: if this line is true, the perm will be rejected
end

如何在 Erlang 中编写类似的东西?

(我的过滤器函数已经用 Erlang 编写,所以我想做一些代码重用)。

顺便问一下,期望的 Erlang 解决方案可以是“本质上并行的”吗?

【问题讨论】:

    标签: recursion erlang stack permutation


    【解决方案1】:

    您可以在排列构造后立即过滤排列。

    只是一个例子,这个 run() 返回以偶数开头的 [1,2,3,4] 的所有排列。函数“检查”(过滤结果)1)检查它是否是完整的排列(结果的长度==源列表的长度),然后2)检查过滤条件(在我的例子中 - 第一个数字是偶数)。

    run() ->
        perm([1,2,3,4],4).
    
    perm([],_) ->
        [[]];
    perm(L,N) -> [[H|T] || H <- L, T <- perm(L--[H],N), check( [H|T] ,N) ].
    
    check(L,N) when length(L) < N -> true;
    check([H|_],_) -> trunc(H/2) == H/2. .
    

    【讨论】:

      【解决方案2】:

      我为这个问题做了一个可能的实现:

      -module(perm).
      
      -export([pred_perms/2, pred/1]).
      
      pred(L = [H | _T]) when H > 1 ->
          L;
      pred(_L) ->
          [].
      
      do_pred_perms([], _Pred) -> 
          [[]];
      do_pred_perms(L, Pred)  -> 
          [Pred([H|T]) || H <- L, T <- do_pred_perms(L--[H], Pred)].
      
      pred_perms(List, Pred) ->
          Res = do_pred_perms(List, Pred),
          lists:filter(fun(E) -> E =/= [] end, Res).
      

      它使用空列表作为必须丢弃的列表的占位符。如果这不可接受,您可以将实现更改为不使用列表压缩。

      pred/1 函数只是用作谓词的示例函数。

      希望这会有所帮助。

      【讨论】:

      • 注意:这个实现不是“本质上并行的”。
      • 亲爱的艾萨克,感谢您的回答。我做 L = lists:seq(1,10).,然后我做 F = fun perm:pred/2.,然后我做 perm:pred_perms(L,F)。结果是 ** 异常错误:perm:pred/2 在函数 perm:'-do_pred_perms/2-lc$^1/1-1-'/5 in call from perm:'-do_pred_perms/2- 中使用一个参数调用lc$^0/1-0-'/3 从 perm:pred_perms/2 调用。我做错了什么?
      • pred 函数只接收 1 个参数。将代码更改为:F = fun perm:pred/1。它应该可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 2012-01-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多