在列表的列表上使用递归
Using recursion on list of lists
我有一个矩阵,它是一个包含九个列表的列表。我的矩阵的直观表示是数独。
我需要 return 数独每个方框 (3x3) 中的数字(或元素)。
例如,这张图片的前三行将表示为
rows =
[[Just 8, Nothing, Nothing, Just 4, Nothing, Just 6, Nothing, Nothing, Just 7],
[Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 4, Nothing, Nothing],
[Nothing, Just 1, Nothing, Nothing, Nothing, Nothing, Just 6, Just 5, Nothing]]
我希望我的函数 return 对于第一个框(以及后来的整个数独)是
[[Just 8, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 1, Nothing], ...]
这是我的尝试:我创建了一个函数,它从前三个列表中获取前三个元素并 returns 它们。
getEm :: [[a]] -> [a]
getEm x = concatMap (take 3)(take 3 x)
然后我创建了另一个函数,它将从前三个列表中删除前三个元素
dropEm :: Eq a => [a] -> [a]
dropEm x = delete itemZ listTwo
where
listOne = delete itemX x
listTwo = delete itemY listOne
itemX = (x!!0)
itemY = (x!!3)
itemZ = (x!!6)`
这是我坚持的部分。我的目标是创建一个递归函数,它接受一个矩阵,然后使用 getEm
获取前三个列表(一个框)的前三个元素并将它们添加到新列表 finalList
。然后函数dropEm
去掉第一个框(前三个列表的前三个元素),然后重复整个过程,直到列表为空,没有"boxes"需要处理。当过程完成时,函数只是 returns finalList
.
这是我想出来的,但我不明白如何用我创建的两个函数实现递归部分。
boxs m = case startList of
[] -> finalList
where
startList = (chunksOf 3 (concat m))
finalList = []
我只是把答案放在这里,因为评论部分可能不适合人们看到它。
import Data.List (transpose)
import Data.List.Split (chunksOf)
subSquares :: Int -> [[a]] -> [[[a]]]
subSquares size = concatMap (chunksOf size)
. transpose
. map (chunksOf size)
例如:
λ > rows = [[(x, y) | x <- [0..8]] | y <- [0..8]]
λ > subSquares 3 rows
[[[(0,0),(1,0),(2,0)],[(0,1),(1,1),(2,1)],[(0,2),(1,2),(2,2)]],[[(0,3),(1,3),(2,3)],[(0,4),(1,4),(2,4)],[(0,5),(1,5),(2,5)]],[[(0,6),(1,6),(2,6)],[(0,7),(1,7),(2,7)],[(0,8),(1,8),(2,8)]],[[(3,0),(4,0),(5,0)],[(3,1),(4,1),(5,1)],[(3,2),(4,2),(5,2)]],[[(3,3),(4,3),(5,3)],[(3,4),(4,4),(5,4)],[(3,5),(4,5),(5,5)]],[[(3,6),(4,6),(5,6)],[(3,7),(4,7),(5,7)],[(3,8),(4,8),(5,8)]],[[(6,0),(7,0),(8,0)],[(6,1),(7,1),(8,1)],[(6,2),(7,2),(8,2)]],[[(6,3),(7,3),(8,3)],[(6,4),(7,4),(8,4)],[(6,5),(7,5),(8,5)]],[[(6,6),(7,6),(8,6)],[(6,7),(7,7),(8,7)],[(6,8),(7,8),(8,8)]]]
经过重新整理,得出:
[ [ [(0,0),(1,0),(2,0)]
, [(0,1),(1,1),(2,1)]
, [(0,2),(1,2),(2,2)]
]
, [ [(0,3),(1,3),(2,3)]
, [(0,4),(1,4),(2,4)]
, [(0,5),(1,5),(2,5)]
]
, [ [(0,6),(1,6),(2,6)]
, [(0,7),(1,7),(2,7)]
, [(0,8),(1,8),(2,8)]
]
, [ [(3,0),(4,0),(5,0)]
, [(3,1),(4,1),(5,1)]
, [(3,2),(4,2),(5,2)]
]
, [ [(3,3),(4,3),(5,3)]
, [(3,4),(4,4),(5,4)]
, [(3,5),(4,5),(5,5)]
]
, [ [(3,6),(4,6),(5,6)]
, [(3,7),(4,7),(5,7)]
, [(3,8),(4,8),(5,8)]
]
, [ [(6,0),(7,0),(8,0)]
, [(6,1),(7,1),(8,1)]
, [(6,2),(7,2),(8,2)]
]
, [ [(6,3),(7,3),(8,3)]
, [(6,4),(7,4),(8,4)]
, [(6,5),(7,5),(8,5)]
]
, [ [(6,6),(7,6),(8,6)]
, [(6,7),(7,7),(8,7)]
, [(6,8),(7,8),(8,8)]
]
]
感谢 的初步想法。 :-)
我有一个矩阵,它是一个包含九个列表的列表。我的矩阵的直观表示是数独。
我需要 return 数独每个方框 (3x3) 中的数字(或元素)。 例如,这张图片的前三行将表示为
rows =
[[Just 8, Nothing, Nothing, Just 4, Nothing, Just 6, Nothing, Nothing, Just 7],
[Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 4, Nothing, Nothing],
[Nothing, Just 1, Nothing, Nothing, Nothing, Nothing, Just 6, Just 5, Nothing]]
我希望我的函数 return 对于第一个框(以及后来的整个数独)是
[[Just 8, Nothing, Nothing, Nothing, Nothing, Nothing, Nothing, Just 1, Nothing], ...]
这是我的尝试:我创建了一个函数,它从前三个列表中获取前三个元素并 returns 它们。
getEm :: [[a]] -> [a]
getEm x = concatMap (take 3)(take 3 x)
然后我创建了另一个函数,它将从前三个列表中删除前三个元素
dropEm :: Eq a => [a] -> [a]
dropEm x = delete itemZ listTwo
where
listOne = delete itemX x
listTwo = delete itemY listOne
itemX = (x!!0)
itemY = (x!!3)
itemZ = (x!!6)`
这是我坚持的部分。我的目标是创建一个递归函数,它接受一个矩阵,然后使用 getEm
获取前三个列表(一个框)的前三个元素并将它们添加到新列表 finalList
。然后函数dropEm
去掉第一个框(前三个列表的前三个元素),然后重复整个过程,直到列表为空,没有"boxes"需要处理。当过程完成时,函数只是 returns finalList
.
这是我想出来的,但我不明白如何用我创建的两个函数实现递归部分。
boxs m = case startList of
[] -> finalList
where
startList = (chunksOf 3 (concat m))
finalList = []
我只是把答案放在这里,因为评论部分可能不适合人们看到它。
import Data.List (transpose)
import Data.List.Split (chunksOf)
subSquares :: Int -> [[a]] -> [[[a]]]
subSquares size = concatMap (chunksOf size)
. transpose
. map (chunksOf size)
例如:
λ > rows = [[(x, y) | x <- [0..8]] | y <- [0..8]]
λ > subSquares 3 rows
[[[(0,0),(1,0),(2,0)],[(0,1),(1,1),(2,1)],[(0,2),(1,2),(2,2)]],[[(0,3),(1,3),(2,3)],[(0,4),(1,4),(2,4)],[(0,5),(1,5),(2,5)]],[[(0,6),(1,6),(2,6)],[(0,7),(1,7),(2,7)],[(0,8),(1,8),(2,8)]],[[(3,0),(4,0),(5,0)],[(3,1),(4,1),(5,1)],[(3,2),(4,2),(5,2)]],[[(3,3),(4,3),(5,3)],[(3,4),(4,4),(5,4)],[(3,5),(4,5),(5,5)]],[[(3,6),(4,6),(5,6)],[(3,7),(4,7),(5,7)],[(3,8),(4,8),(5,8)]],[[(6,0),(7,0),(8,0)],[(6,1),(7,1),(8,1)],[(6,2),(7,2),(8,2)]],[[(6,3),(7,3),(8,3)],[(6,4),(7,4),(8,4)],[(6,5),(7,5),(8,5)]],[[(6,6),(7,6),(8,6)],[(6,7),(7,7),(8,7)],[(6,8),(7,8),(8,8)]]]
经过重新整理,得出:
[ [ [(0,0),(1,0),(2,0)]
, [(0,1),(1,1),(2,1)]
, [(0,2),(1,2),(2,2)]
]
, [ [(0,3),(1,3),(2,3)]
, [(0,4),(1,4),(2,4)]
, [(0,5),(1,5),(2,5)]
]
, [ [(0,6),(1,6),(2,6)]
, [(0,7),(1,7),(2,7)]
, [(0,8),(1,8),(2,8)]
]
, [ [(3,0),(4,0),(5,0)]
, [(3,1),(4,1),(5,1)]
, [(3,2),(4,2),(5,2)]
]
, [ [(3,3),(4,3),(5,3)]
, [(3,4),(4,4),(5,4)]
, [(3,5),(4,5),(5,5)]
]
, [ [(3,6),(4,6),(5,6)]
, [(3,7),(4,7),(5,7)]
, [(3,8),(4,8),(5,8)]
]
, [ [(6,0),(7,0),(8,0)]
, [(6,1),(7,1),(8,1)]
, [(6,2),(7,2),(8,2)]
]
, [ [(6,3),(7,3),(8,3)]
, [(6,4),(7,4),(8,4)]
, [(6,5),(7,5),(8,5)]
]
, [ [(6,6),(7,6),(8,6)]
, [(6,7),(7,7),(8,7)]
, [(6,8),(7,8),(8,8)]
]
]
感谢