【问题标题】:How does this Haskell function to calculate permutations using list comprehension work?这个使用列表理解计算排列的 Haskell 函数如何工作?
【发布时间】:2010-08-07 22:15:54
【问题描述】:

我正在阅读 Simon Thompson 的 Haskell:函数式编程的工艺,我想知道它是如何工作的:

perms [] = [[]]
perms xs = [ x:ps | x <- xs , ps <- perms ( xs\\[x] ) ]

我似乎无法理解 perms( xs\\[x] ) 应该如何运作。两个元素列表的踪迹显示:

perms [2,3]
  [ x:ps | x <- [2,3] , ps <- perms ( [2,3] \\ [x] ) ]       exe.1
  [ 2:ps | ps <- perms [3] ] ++ [ 3:ps | ps <- perms [2] ]   exe.2
  ...

你如何从exe.1 到exe.2?

【问题讨论】:

  • 你知道吗,我是个白痴。那是我看到的关于列表理解的第一个痕迹。跟踪显示要一次创建的列表的所有元素。我不知道为什么我认为第三行是要创建的列表的第二个元素。

标签: haskell permutation list-comprehension


【解决方案1】:

它基本上说:

  1. 从列表xs (x &lt;- xs) 中获取任何x
  2. 以ps 为列表xs\\[x] 的排列(即xs 已删除x)-perms ( xs\\[x] )
  3. 返回结果。

perms(xs\\[x]) 是从xs 中删除x 的递归调用。

【讨论】:

    【解决方案2】:

    好吧,它只是将2 和3 分别插入[2,3] \\ [x]。所以你有

    [ 2:ps | ps <- perms ([2,3] \\ [2]) ] ++ [ 3:ps | ps <- perms ([2,3] \\ [3]) ]
    

    由于\\是差分运算符,即返回第一个列表中不在第二个列表中的元素,结果分别为[3]和[2]。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 2021-12-11
      • 2020-06-16
      • 1970-01-01
      相关资源
      最近更新 更多