【问题标题】:Cartesian Product of a list of lists in ErlangErlang中列表列表的笛卡尔积
【发布时间】:2014-05-27 08:41:59
【问题描述】:

我有一个列表列表(在 erlang 中,字符串是列表),如下所示:

["abc","def"]

我想在函数返回的列表中获得以下组合:

[“ad”、“ae”、“af”、“bd”、“be”、“bf”、“cd”、“ce”、“cf”]

列表理解可以吗? 我事先不知道列表的维度

【问题讨论】:

    标签: list erlang list-comprehension cartesian-product


    【解决方案1】:

    如果你不知道输入的维度,那么你需要像@legoscia所说的那样使用递归:

    cartesian([H])   -> [[A] || A <- H];
    cartesian([H|T]) -> [[A|B] || A <- H, B <- cartesian(T)].
    

    一维输入“abc”变成["a", "b", "c"],其他都是递归。

    > cartesian:cartesian(["abc", "def", "ghi"]).
     ["adg","adh","adi","aeg","aeh","aei","afg","afh","afi",
     "bdg","bdh","bdi","beg","beh","bei","bfg","bfh","bfi","cdg",
     "cdh","cdi","ceg","ceh","cei","cfg","cfh","cfi"]
    

    编辑: 或者更简单:让一个 0-dim 参数返回包含空集的集合。我想这也是一个数学家会做的事情。

    cartesian([H|T]) -> [[A|B] || A <- H, B <- cartesian(T)];
    cartesian([]) -> [[]].
    

    【讨论】:

      【解决方案2】:

      如果你正好有两个列表,那么你可以用这样的列表推导来做到这一点:

      1> [[X,Y] || X <- "abc", Y <- "def"].
      ["ad","ae","af","bd","be","bf","cd","ce","cf"]
      

      如果您有任意数量的列表,您可以使用递归函数中的列表推导来实现。

      【讨论】:

      • 递归函数?您可以根据需要向列表推导添加任意数量的输入,所以我猜只有在您事先不知道维度时才需要(显式)递归。
      • 我有两个以上的列表。你能提供一个递归解决方案的例子吗?
      • [[X,Y,Z] || X
      • 我事先不知道尺寸。
      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 2015-12-05
      • 2017-07-15
      • 2012-01-03
      • 2021-10-22
      • 2011-07-10
      • 2020-12-21
      • 1970-01-01
      相关资源
      最近更新 更多