C 语言版的一个问题的 Haskell 实现
原题在此:
http://bbs.chinaunix.net/thread-1260094-1-1.html
Haskell Code:
- #!/usr/bin/runhaskell
- import System.Environment
- f' 1 = [0]
- f' n = prefix ++ middle ++ postfix
- where half = n `div` 2
- (prefix, postfix) = splitAt (half) $ f' (n-1)
- middle = if n `mod` 2 == 1
- then [half]
- else [half-1]
- f'' _ 0 = []
- f'' offset n = f'' (offset+1) (n-1) ++ [thisLine]
- where thisLine = white ++ foldr ((++) . (++" ")) "" items
- white = map (const ' ') [1..offset]
- items = map (show) (f' n)
- f n = mapM_ (putStrLn) $ f'' 0 n
- main = do
- [str] <- getArgs
- let n = read str
- f n
复制代码
打印结果:
- flw@debian:~/study$ ./ttt.hs 10
- 0
- 0 0
- 0 1 0
- 0 1 1 0
- 0 1 2 1 0
- 0 1 2 2 1 0
- 0 1 2 3 2 1 0
- 0 1 2 3 3 2 1 0
- 0 1 2 3 4 3 2 1 0
- 0 1 2 3 4 4 3 2 1 0
- flw@debian:~/study$ ./ttt.hs 20
- 0
- 0 0
- 0 1 0
- 0 1 1 0
- 0 1 2 1 0
- 0 1 2 2 1 0
- 0 1 2 3 2 1 0
- 0 1 2 3 3 2 1 0
- 0 1 2 3 4 3 2 1 0
- 0 1 2 3 4 4 3 2 1 0
- 0 1 2 3 4 5 4 3 2 1 0
- 0 1 2 3 4 5 5 4 3 2 1 0
- 0 1 2 3 4 5 6 5 4 3 2 1 0
- 0 1 2 3 4 5 6 6 5 4 3 2 1 0
- 0 1 2 3 4 5 6 7 6 5 4 3 2 1 0
- 0 1 2 3 4 5 6 7 7 6 5 4 3 2 1 0
- 0 1 2 3 4 5 6 7 8 7 6 5 4 3 2 1 0
- 0 1 2 3 4 5 6 7 8 8 7 6 5 4 3 2 1 0
- 0 1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1 0
- 0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 1 0
复制代码
[ 本帖最后由 flw 于 2008-9-4 18:07 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
复制代码
哈哈,互相帮助吧,我写的时候也是参照了你的代码的。
最近正为 Monad transformer 头疼呢,不过这两天看 GHC 的 monad transformer 的实现还是蛮有收获的
[ 本帖最后由 MMMIX 于 2008-9-4 22:42 编辑 ]
我对预定义函数的熟悉程度还不够啊。
谢谢 MMMIX 的指点。
看看这个也许有帮助,How to read Haskell
http://www.haskell.org/haskellwiki/How_to_read_Haskell
还处于完全看不懂的阶段。
我的版本:
复制代码
flw 代码改进易读性后的版本:
复制代码
貌似Haskell的语法比较对我胃口,呵呵。