假设有动态数量的嵌套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类型
中答案 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]