Haskell 是否可以在不使用列表函数或列表synthax的情况下计算以下迷宫的高度和宽度
我的目标是编写一个函数,使用以下代码计算迷宫的宽度和高度。到目前为止,我只找到了使用列表函数或列表语法的方法,但我想找到一种不使用列表语法的替代解决方案。我是一名Haskell初学者,对一般编程非常陌生Haskell 是否可以在不使用列表函数或列表synthax的情况下计算以下迷宫的高度和宽度,haskell,Haskell,我的目标是编写一个函数,使用以下代码计算迷宫的宽度和高度。到目前为止,我只找到了使用列表函数或列表语法的方法,但我想找到一种不使用列表语法的替代解决方案。我是一名Haskell初学者,对一般编程非常陌生 showLabyrinth labyrinth = putStrLn $ unlines $ [[labyrinth j i | i <- [1..dimH]] | j <- [1..dimV]] where dimH = length . takeWhile (/='
showLabyrinth labyrinth =
putStrLn $ unlines $ [[labyrinth j i | i <- [1..dimH]] | j <- [1..dimV]]
where
dimH = length . takeWhile (/='O') $ [labyrinth 1 i | i <- [1..]]
dimV = length . takeWhile (/='O') $ [labyrinth i 1 | i <- [1..]]
labyrinthA 9 _ = 'O'
labyrinthA _ 16 = 'X'
labyrinthA _ 17 = 'O'
labyrinthA 1 _ = 'X'
labyrinthA 2 1 = 'X'
labyrinthA 2 8 = 'X'
labyrinthA 2 12 = 'X'
labyrinthA 2 _ = ' '
labyrinthA 3 1 = 'X'
labyrinthA 3 3 = 'X'
labyrinthA 3 5 = 'X'
labyrinthA 3 6 = 'X'
labyrinthA 3 8 = 'X'
labyrinthA 3 9 = 'X'
labyrinthA 3 10 = 'X'
labyrinthA 3 12 = 'X'
labyrinthA 3 14 = 'M'
labyrinthA 3 _ = ' '
labyrinthA 4 1 = 'X'
labyrinthA 4 2 = 'X'
labyrinthA 4 3 = 'X'
labyrinthA 4 5 = 'X'
labyrinthA 4 6 = 'X'
labyrinthA 4 12 = 'X'
labyrinthA 4 _ = ' '
labyrinthA 5 1 = 'X'
labyrinthA 5 5 = 'X'
labyrinthA 5 8 = 'X'
labyrinthA 5 9 = 'X'
labyrinthA 5 10 = 'X'
labyrinthA 5 12 = 'X'
labyrinthA 5 13 = 'X'
labyrinthA 5 15 = 'X'
labyrinthA 5 _ = ' '
labyrinthA 6 1 = 'X'
labyrinthA 6 3 = 'X'
labyrinthA 6 4 = 'X'
labyrinthA 6 5 = 'X'
labyrinthA 6 7 = 'X'
labyrinthA 6 8 = 'X'
labyrinthA 6 10 = 'X'
labyrinthA 6 _ = ' '
labyrinthA 7 1 = 'X'
labyrinthA 7 6 = 'T'
labyrinthA 7 9 = 'X'
labyrinthA 7 10 = 'X'
labyrinthA 7 11 = 'X'
labyrinthA 7 12 = 'X'
labyrinthA 7 13 = 'X'
labyrinthA 7 14 = 'X'
labyrinthA 7 15 = 'X'
labyrinthA 7 _ = ' '
labyrinthA 8 6 = 'E'
labyrinthA 8 _ = 'X'
labyrinthB 7 6 = '.'
labyrinthB 6 6 = '.'
labyrinthB 5 6 = '.'
labyrinthB 5 7 = '.'
labyrinthB 4 7 = '.'
labyrinthB 4 8 = '.'
labyrinthB 4 9 = '.'
labyrinthB 4 10 = '.'
labyrinthB 4 11 = '.'
labyrinthB 5 11 = '.'
labyrinthB 6 11 = '.'
labyrinthB 6 12 = '.'
labyrinthB 6 13 = '.'
labyrinthB 6 14 = '.'
labyrinthB 5 14 = '.'
labyrinthB 4 14 = 'T'
labyrinthB x y = labyrinthA x y
labyrinthC 3 14 = ' '
labyrinthC 4 14 = ' '
labyrinthC x y = labyrinthB x y
显示迷宫迷宫=
putStrLn$unlines$[[迷宫j i | i您可以使用递归函数执行此操作:
type Labyrinth = Int -> Int -> Char
width :: Labyrinth -> Int
width l = width' 1
where width' n | l 1 n == 'O' = n-1
| otherwise = width' (n+1)
这是一种相对标准的递归技术。函数width
使用一个辅助函数width'
,该函数获取当前列索引(第一次被width
调用时以1
开始)。它检查迷宫函数是否在该列返回带有“模式保护”的'O'
。如果返回,它将返回列的索引,就在'O'
之前。如果返回不返回,它将递归调用自己以检查下一列。可能重复您为什么要避免列表?非常感谢。您对练习递归方法有何建议?我对这种编程技术不是很有经验。@Napkin实现map
,filter
,foldl
和foldr
。实现init
,last
,(++)
和reverse
。中的大多数函数都可以递归实现。其中还包括大量递归实践。