haskell 基础题解(11)

打印金字塔2

【问题】打印出如下图的金字塔
jinzita
这个题目与【问题10】很类似。
如果你用其它语言解决过类似的问题,请回议一下:
当已经完成了 10题,再来解这个题的时候,有多少东西可以重用呢?
我看到很多人都几乎是从头开始了。

为什么? 因为星号的模式很不同啊,原来的算星号位置、数量的东西都没用了啊,至于输出那点代码重写没什么大工作量啊。
看出问题不? 解法的核心逻辑缺少通用性!!!

来看看 haskell 的解法吧:

import Data.List (intersperse)

xing' = intersperse ' ' $ repeat '*' 
xing  = [ take i xing' | i<-[1,3..] ]
kong  = [ replicate i ' ' | i<-[0..] ]

ok :: Int -> [String]
ok n = zipWith (++) (reverse $ take n kong) (take n xing) 

out :: [String] -> String
out xs = concat $ intersperse "\n" xs

main = putStrLn $ out (ok 9)

与【问题10】比较,代码基本不动,唯一改的是 xing 这个函数,它生成的东西不是全星号,是星号与空格的间隔组成的。
你可以把这三角形,想象成一块布。它上面换换花纹,你就重写所有代码,不是很悲哀吗?

如果你仔细去安排每个星号位置,那我把它换成 ABCDABCDAB… 这样的花纹,你不是很苦恼吗?

从这个代码中,发现 haskell 特有的强大地方吗? 构造无限的序列,用的时候截一段,省心省力,优美难以言表。。。。。
xing’ 就是一个 星号和空格相间的 无限序列而已
xing 用 xing’ 来构建自己的小花布。

函数式语言应该在高校推广,对我国软件工程水平会大有好处。。。。不能太急功近利啊,哪怕这种语言一辈子都没有用的机会。它的思想、方法论太重要了!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值