免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6111 | 回复: 2
打印 上一主题 下一主题

[haskell] 遍历列表的一个技巧 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-28 13:04 |只看该作者 |倒序浏览
本帖最后由 retuor 于 2010-07-28 13:05 编辑

本来是遍历树的,我把它简化成遍历列表了,本质一样的。

题目:有个整数列表 [a,b,c,...,z],s 为全部元素的和,把这个列表转换成 [a/s, b/s, ...., z/s]. 要求只遍历一次。

代码是这样的:

  1. g s (x:xs)=  (fromIntegral(x)/fromIntegral(s): p, x+s' )
  2.     where (p, s')= g s xs

  3. g s _ = ([], 0)

  4. f l = l'
  5.     where (l', s) = g s l
复制代码
它是按 a/s: (b/s) : .... : [] 来构造输出的,这种方法在函式编程里太常见了。不同寻常的地方是,那些 a/s, b/s 的值开始的时候是不确定的,直到把链表遍历完成时,才得到 s 的值。

论坛徽章:
0
2 [报告]
发表于 2010-07-28 21:32 |只看该作者
其实还是两遍:  计算 x + s' 一遍, 返回  [x/s] 一遍

论坛徽章:
0
3 [报告]
发表于 2010-07-28 22:10 |只看该作者
收集数据一次,输出一次。这样总要两次的。可以把题目所说的遍历一次理解成搜索数据一次,输出不算。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP