haskell基础题解(14)

蛇形填充

【题目】用自然数蛇形填充一个 N 阶的方阵。当N=5时,形如:
在这里插入图片描述
这个问题用 haskell 解决时与【题目13】差别甚微。
实际上,从函数式的思考习惯看,只要让有些行作成后反转一下就可以了。
上代码:

ju n = [ f x | x<-[0..n-1] ] where
 f row | even row = take n [row*n+1..]
       | odd  row = reverse . take n $ [row*n+1..]

bu :: Int -> String -> String
bu n s = let x = length (show (n*n))
            y = length s
        in replicate (x-y) ' ' ++ s

ok :: Int -> [String]
ok n = map (unwords . map (bu n . show)) (ju n)

main = putStrLn $ unlines (ok 5)  

$ 在 haskell 中的定义很有意思。
f $ x = f x
这有用?? 是的,虽然还是调用函数,但 $ 的优先级最低。可以避免我们用太多的括号,使人眼花。
reverse . take n $ [row*n+1..] 的意思是:
(reverse . take n) [row*n+1..]
再结合 (.)的定义,上式等价于:
reverse (take n [row*n+1..])

函数的定义后用竖线,表示后面要跟一个限定条件,满足后才匹配。
一般是多个条件,最好能全覆盖,所以,最后一个条件一般都是 otherwise,实际上就是true
因而,也可以这么写:

  f row | even row  = take n [row*n+1..]
        | otherwise = reverse . take n $ [row*n+1..]

或者:

  f row | even row  = take n [row*n+1..]
        | True = reverse . take n $ [row*n+1..]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值