haskell - 使用 Haskell 打印菱形图案

标签 haskell recursion io

我需要编写一个 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==0next 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/

相关文章:

java - 检查数组是否在java中递归排序

haskell - 读取文件时限制内存使用

java - URL.getContent 编码错误

haskell - 导入的函数似乎与原始实现的运行方式不同

ubuntu - Haskell - GHC 错误 : Could not find module ‘Prelude’/Perhaps you haven't installed the profiling libraries for package ‘base-4.12.0.0’ ?

haskell - 使用 netwire 进行游戏实体建模

python - 在文本文件 Python 中写入时,将新行符号保留在字符串中

haskell - Haskell 中的表观类型变量行为不一致说明

java - 欧拉计划 14 Java

C++ decltype,带有if语句,用于递归函数