本帖最后由 杜鹏飞 于 2013-4-4 23:00 编辑
前几天看到同事买了一本书,讲的就是Hadoop,厚的吓死人,于是乎没怎么去了解。刚刚看到了老师的这篇文章,写的不错,百度了一下发现map和reduce似乎是
python固有的函数,而且reduce的兰博德表达式只支持传递两个参数,老师一开始没指明,害我苦思reduce的实现很久,这是后话了。本人未学习过python,故打算
用lua实现下这两个函数。map很简单:- function map(f,list)
- function list_table(list)
- local iter = 0
- local len = table.getn(list)
- return function()
- iter = iter+1
- if iter <= len then return list[iter] end
- end
- end
- local ret={}
- for ele in list_table(list) do
- table.insert(ret,f(ele))
- end
- return ret
- end
复制代码 我采用了迭代器+泛型for的形式,python好像支持泛型for(函数式程序设计语言好像都支持T_T)
接下来写reduce,reduce的一般形式是容易实现的,但是,我忽然想到了一个东西,那就是如果让reduce去返回一个中间值的表,会如何呢?见程序:- function reduce(f,list)
- function list_table(list)
- local iter = 0
- local len = table.getn(list)
- return function()
- iter = iter+1
- if iter <= len then return list[iter] end
- end
- end
- local ret={}
- for ele in list_table(list) do
- if table.getn(ret) == 0 --问题在此!
- then table.insert(ret,ele)
- else table.insert(ret,f(ret[table.getn(ret)],ele)) end
- end
- return ret
- end
复制代码 我的这种写法做了O(n)次无谓的判断!我认为应该有更优秀的写法,能深刻利用泛型for的特点或巧妙地赋值来避免无谓的测试,如能指点,不胜感激。 |