haskell 基础题解(10)

打印金字塔1

【题目】在控制台打印如下的星号组成的金字塔图形
xinghao-jinzita
这是比较初级的练习题目。解法五花八门。
这里给出的 haskell 的解法,注重函数式的思考模式。
这种思考习惯真的真的很重要!!!

import Data.List (intersperse)

xing = [ replicate i '*' | 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 8)

xing 函数构造了一个无限序列,每一项含有多个星号组成的串。数目分别是 1, 3, 5, 7, 。。。
kong 函数构造了一个含有渐多空格的串的序列。数目分别为: 0,1,2,3, 。。。
ok 则对上两个序列截取 n 个,kong 反转后,拼接在 xing 的前边
这个就基本上是我们要的东西了。
只不过输出到屏幕的时候,每行后需要一个换行符而已。这个通用的工作交给 out 完成

这段代码中,没有仔细地计算星号出现的位置,出现的数量,什么时候回车等等。
它只是从总体上考虑需求,把它分解为若干十分常见的小任务而已。
没有循环,只有函数间的接力,写起来有种出了一口恶气的感觉(被软件欺压的久了。。。)

常有人说自已做了个十分复杂、离奇的梦。看见了不可思议的事物。。。。
其实,你所见只是现实生活中见过的事物的组合,没有发明出任何新东西。

软件的需求或许也是这样,没有真正奇怪,真正复杂的需求,它只掩盖在复杂处表下十分通用的小任务的组合而已。

函数式的思考习惯很自然地把问题向更通用的方向转化。不像我们在面向对象的语言中,为了将来的通用,去发明出更多的概念(称之为设计模式),引入更多的复杂性。或许这正是函数式语言真正强大的地方吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值