Haskell列表的嵌套笛卡尔积

问题描述 投票:9回答:3

我想创建一个方法,在其中我可以给它一个长度列表,它将返回直到那些长度的所有笛卡尔坐标的组合。用一个例子更容易解释:

cart [2,5]
Prelude> [ [0,0],[0,1],[0,2],[0,3],[0,4],[1,0],[1,1],[1,2],[1,3],[1,4] ]

cart [2,2,2]
Prelude> [ [0,0,0],[0,0,1],[0,1,0],[0,1,1],[1,0,0],[1,0,1],[1,1,0],[1,1,1] ]

简单的列表理解将不起作用,因为我不知道列表将持续多长时间。尽管我喜欢Haskell的许多问题的简单性,但是我可以在5分钟内用程序(用C语言或类似语言)编写该代码,而Haskell却给了我一个动脉瘤!

解决这个特定问题将对我有很大帮助;处理此类问题时,我也很想听听您的思考过程。

haskell list-comprehension cartesian-product
3个回答
12
投票

这可以递归解决。首先,Cartesian product of nothing为{∅}:

cart [] = [[]]

((或如果空白产品无效,则仅定义1元素形式:

cart [x] = [[i] | i <- [0 .. x-1]]

然后,x:xs的笛卡尔积可以写成

cart (x:xs) = [i:rest | i <- [0 .. x-1], rest <- cart xs]

通常,如果要编写需要列表长度N的函数f,请尝试考虑使f(N)依赖较小列表的方法,例如仅使用f(N-1),然后求解基本情况f(0)f(1)等。这将问题转换为易于解决的递归。] >


13
投票

嗯.. >>

cart = sequence . map (enumFromTo 0 . subtract 1)

7
投票

我打赌您的程序解决方案将涉及递归。我们的Haskell解决方案也将涉及递归。

© www.soinside.com 2019 - 2024. All rights reserved.