我想创建一个方法,在其中我可以给它一个长度列表,它将返回直到那些长度的所有笛卡尔坐标的组合。用一个例子更容易解释:
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却给了我一个动脉瘤!
解决这个特定问题将对我有很大帮助;处理此类问题时,我也很想听听您的思考过程。
这可以递归解决。首先,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)等。这将问题转换为易于解决的递归。] >
嗯.. >>
cart = sequence . map (enumFromTo 0 . subtract 1)
我打赌您的程序解决方案将涉及递归。我们的Haskell解决方案也将涉及递归。