如何在没有for循环的情况下在haskell中使用嵌套for循环的递归

时间:2014-10-05 14:24:03

标签: haskell

假设有动态数量的嵌套for循环输出所有组合

在这个例子中,有3个嵌套的forloop,用于生成所有组合的列表,例如 [1,2,3],[1,3,5]等。

如果有N个嵌套的forloop,如何在haskell中使用递归?

伪代码

for i from 1 to 5 do
     for j from 1 to 10 do
          if i < j then
          for k from 1 to 50 do
               if j < k then
                  list1 :: [i,j,k]

未完成的forloop编译错误

forloop :: Integer -> Integer -> [a]
forloop n m
    | n == 1 = 1
    | otherwise =  if n > m 
                     then [(forloop n-1 m)] ++ [n]
                     else []

期望一个递归版本的函数可以像rednet一样保存在.net framework的Action类型

2 个答案:

答案 0 :(得分:1)

在Haskell中,通常,您使用数据结构来驱动流,而不是控制结构(如for循环)。在您的特定示例中,简单的列表解析将使用单行代码解决相同的情况。正如您在下面所看到的,这一行代码的意图也非常明确:

[(i,j,k) | i <- [1..5], j <- [1..10], k <- [1..50], i < j, j < k]

如果您不想使用列表推导,您仍然可以使用结构化递归创建一个非常简洁的版本,或者作为最后的手段,使用显式递归。

我希望这会有所帮助。

答案 1 :(得分:0)

假设您有每个嵌套级别的范围结束列表。如果您有更短范围列表的解决方案,请考虑如何生成列表。

solve :: [Int] -> Int -> [[Int]]
solve [] _ = [[]]
solve (r:t) i = [j:s | j <- [i+1..r], s <- solve t j]