免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: flw
打印 上一主题 下一主题

C 语言版的一个问题的 Haskell 实现 [复制链接]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
11 [报告]
发表于 2008-09-04 23:03 |只看该作者
上面的 Haskell  实现共有的一个问题就是当参数 > 20 时,最后输出的三角形就歪了(当然,这个可以通过更复杂的输出函数来修正)。不知道 Emacs Lisp 的实现有没有这个问题?

[ 本帖最后由 MMMIX 于 2008-9-4 23:04 编辑 ]

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
12 [报告]
发表于 2008-09-04 23:04 |只看该作者
lisp简直就是天书啊!

我还是继续看Haskell到语法去吧。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
13 [报告]
发表于 2008-09-04 23:11 |只看该作者
原帖由 MMMIX 于 2008-9-4 23:03 发表
上面的 Haskell  实现共有的一个问题就是当参数 > 20 时,最后输出的三角形就歪了(当然,这个可以通过更复杂的输出函数来修正)。不知道 Emacs Lisp 的实现有没有这个问题?

那个问题很好修正。
就是把一个空格变成多个空格就行了。

论坛徽章:
0
14 [报告]
发表于 2008-09-04 23:15 |只看该作者
原帖由 MMMIX 于 2008-9-4 23:03 发表
上面的 Haskell  实现共有的一个问题就是当参数 > 20 时,最后输出的三角形就歪了(当然,这个可以通过更复杂的输出函数来修正)。不知道 Emacs Lisp 的实现有没有这个问题?


一样是歪的,都输出那些串。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
15 [报告]
发表于 2008-09-05 01:11 |只看该作者
原帖由 flw 于 2008-9-4 23:11 发表

那个问题很好修正。
就是把一个空格变成多个空格就行了。

关键是,怎么知道变成几个?算这个会把代码搞复杂。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
16 [报告]
发表于 2008-09-05 08:17 |只看该作者
原帖由 MMMIX 于 2008-9-5 01:11 发表

关键是,怎么知道变成几个?算这个会把代码搞复杂。

这个很简单吧。
我试试看。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
17 [报告]
发表于 2008-09-05 08:39 |只看该作者
  1. import System.Environment
  2. import Data.List
  3. import Text.Printf

  4. f' 1 = [0]
  5. f' n = prefix ++ middle ++ postfix
  6.   where half = n `div` 2
  7.         (prefix, postfix) = splitAt (half) $ f' (n-1)
  8.         middle = if n `mod` 2 == 1
  9.                   then [half]
  10.                   else [half-1]

  11. f'' _ 0 _ = []
  12. f'' offset n sep = f'' (offset+1) (n-1) sep ++ [ thisLine ]
  13.   where thisLine = white ++ foldr ((++) . (++sep)) "" items
  14.         white = concatMap (const sep) [1..offset]
  15.         items = map (printf $ "%" ++ (show $ length sep) ++ "d") $ f' n

  16. f n = mapM_ (putStrLn) $ f'' 0 n sep
  17.   where sep = flip replicate ' ' $ length $ show ((n-1)`div`2)

  18. main = do
  19.   [str] <- getArgs
  20.   let n = read str
  21.   f n
复制代码

其实思路还是很简单的,就是因为对库不太熟悉,因此很多写法有些绕。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
18 [报告]
发表于 2008-09-05 09:36 |只看该作者

回复 #17 flw 的帖子

我的想法是让最终输出的每一列居中对齐。不过这样做的话如果行数很多,最开始的一些行就会变的很稀疏

论坛徽章:
0
19 [报告]
发表于 2008-09-05 20:29 |只看该作者
lisp 的括号很好看。呵呵

论坛徽章:
0
20 [报告]
发表于 2008-09-10 13:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP