Haskell实现'#'字符山mountain函数的otherwise分支编写方法
Haskell
mountain 函数补全方案 需求回顾
实现mountain :: Int -> String函数,规则如下:
- 输入整数n为山的高度,输出由
#构成的东侧可攀登的山形字符串 - 从上至下每行的
#数量逐行递增1,行与行之间用换行符分隔 - 输出末尾不得添加多余换行
- 传入高度为负值时按0处理,返回空字符串
现有代码问题
给出的初始代码存在一处语法错误:高度为2的分支中,判断条件后误用了比较运算符==,需要改为赋值用的单等号=,即修正为| a == 2 = "#\n##"。
otherwise分支实现
按照当前代码的递归写法逻辑,高度为a的山形,等价于高度为a-1的完整山形内容,拼接一个换行符后,再拼接a个连续的#字符即可。直接使用Prelude内置的replicate函数生成指定长度的重复字符,无需引入额外依赖。
补全的分支代码如下:
| otherwise = mountain (a - 1) ++ "\n" ++ replicate a '#'
完整可运行代码
mountain :: Int -> String mountain a | a < 1 = "" | a == 1 = "#" | a == 2 = "#\n##" | otherwise = mountain (a - 1) ++ "\n" ++ replicate a '#'
正确性验证
- 输入小于1的值(含负数):例如
mountain (-2)、mountain 0均返回空字符串"",符合边界规则 - 输入3:返回
"#\n##\n###",每行#数量逐行+1,换行分隔正确,末尾无多余换行,完全满足需求 - 输入5:返回
"#\n##\n###\n####\n#####",规则匹配正确
内容的提问来源于stack exchange,提问作者maros
相关产品推荐
相关产品推荐

