我有一个递归函数,用于绘制ASCII艺术中的一些图片。
非常简单type Picture = [[Char]]
white :: Picture
white = ["......",
"......",
"......",
"......",
"......",
"......"]
black = ["######",
"######",
"######",
"######",
"######",
"######"]
printPicture :: Picture -> IO ()
printPicture = putStr . concat . map (++"\n")
使用这些块我想构建一个游戏板。我已经定义了一些功能,它们是:
blackinWhite :: Integer -> Integer -> Picture
blackinWhite n m | n==1 && m==1 = black
| n==1 = white
| n==m = black `beside` blackinWhite (n-1) m
| otherwise = white `beside` blackinWhite (n-1) m
blackinWhite' :: Integer -> Integer -> Picture
blackinWhite' n m | n==1 && m==1 = black
| n==1 = white
| n==m = black `above` blackinWhite' (n-1) m
| otherwise = white `above` blackinWhite' (n-1) m
diagonalrug :: Integer -> Integer -> Picture
diagonalrug n m | m==1 = blackinWhite n m
| otherwise = blackinWhite n m `above` diagonalrug n (m-1)
antidiagrug :: Integer -> Integer -> Picture
antidiagrug n m | m==1 = blackinWhite' n m
| otherwise = antidiagrug n (m-1) `beside` blackinWhite' n m
crossedrug :: Integer -> Integer -> Picture
crossedrug n m | dimn /= 0 || dimm /= 0= error("Come back later")
| otherwise = diagonalrug dimn dimm --((diagonalrug dimn dimm) `beside` (antidiagrug dimn dimm)) `above` ((antidiagrug dimn dimm) `beside` (diagonalrug dimn dimm))
where
dimn = mod n 2
dimm = mod m 2
如果我在交互式会话中这样做:
*Main> diagonalrug 2 2
程序挂起,我的电脑冻结了。如果我直接执行otherwise
之后的语句,结果将毫无问题地给出。为什么我调用函数crossrug ghci崩溃?
(我没有提供函数above
和beside
,因为它们只是连接两个应该从上下文中清楚的图片。)
答案 0 :(得分:3)
只需执行即可。
你用2 2
调用它,它转到其他地方并调用diagonalrug 0 0
,而diagonalrug 0 -1
依次转到从不终止的else子句,因为它调用m
所以{{1绝不是1(它一直是负面的)。
diagonalrug
缺少该情况的停止条件。