我需要编写一个 Haskell 程序,它将递归地生成钻石输出。
这是给定输入的一些示例输出
输入:1
输出:
*
* *
*
输入:2
输出:
*
* *
*
* *
* * * *
* *
*
* *
*
输入:3
输出:
*
* *
*
* *
* * * *
* *
*
* *
*
* *
* * * *
* *
* * * *
* * * * * * * *
* * * *
* *
* * * *
* *
*
* *
*
* *
* * * *
* *
*
* *
*
我编写了以下函数:
next 0 = [1,0,1]
next n = map (+3^n) (next (n-1)) ++ next (n-1) ++ map (+3^n) (next (n-1))
lpad n = map (++"*") (zipWith ($) (map (take)(next (n-1))) ((repeat(repeat ' '))))
pretty n = putStrLn $ intercalate "\n" $ lpad n
给出以下输出:
漂亮1
*
*
*
漂亮2
*
*
*
*
*
*
*
*
*
谁能帮我处理剩下的一半吗?提前致谢。
最佳答案
对于n==0
,next n
描述了镜像之前的整个画面。对于更大的n
,情况就不再是这样了。因此,第一步,我们更改 next
函数以输出对称图片:
mmap = map . map
next :: Int -> [[Int]]
next 0 = [[1],[0,2],[1]]
next n = sn ++ map (\a -> a ++ map (+2*3^n) a) nn ++ sn
where
nn = next (n - 1)
sn = mmap (+3^n) nn
现在,next n
描述了所有星星的位置。为了打印它们,我们首先计算相对距离。
diffs :: [Int] -> [Int]
diffs (x:xs) = x: diffs' x (xs)
where
diffs' x (y:ys) = y - x - 1 : diffs' y ys
diffs' _ [] = []
diffs [] = []
lpad :: Int -> [[Char]]
lpad = map (concatMap $ \n -> replicate n ' ' ++ "*") . map diffs . next'
应用于一行,diffs
返回我们需要在每个星号之前放置的空格数的列表,lpad
从中生成图片。像以前一样打印它:
pretty :: Int -> IO ()
pretty n = putStrLn $ unlines $ lpad n
关于haskell - 使用 Haskell 打印菱形图案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13778632/