打印金字塔1
【题目】在控制台打印如下的星号组成的金字塔图形
这是比较初级的练习题目。解法五花八门。
这里给出的 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 完成
这段代码中,没有仔细地计算星号出现的位置,出现的数量,什么时候回车等等。
它只是从总体上考虑需求,把它分解为若干十分常见的小任务而已。
没有循环,只有函数间的接力,写起来有种出了一口恶气的感觉(被软件欺压的久了。。。)
常有人说自已做了个十分复杂、离奇的梦。看见了不可思议的事物。。。。
其实,你所见只是现实生活中见过的事物的组合,没有发明出任何新东西。
软件的需求或许也是这样,没有真正奇怪,真正复杂的需求,它只掩盖在复杂处表下十分通用的小任务的组合而已。
函数式的思考习惯很自然地把问题向更通用的方向转化。不像我们在面向对象的语言中,为了将来的通用,去发明出更多的概念(称之为设计模式),引入更多的复杂性。或许这正是函数式语言真正强大的地方吧。