« taoqinghua | 首页 | R »
在 Javascript面向对象编程(二):构造函数的继承 留言:
感觉把面向对象的东西在js上面实现一遍, 增大代码了维护的难度, 而不是减小了维护的难度. 正在思索, 这么做是不是有必要呢?
2011-07-29 22:02:12
在 快速排序(Quicksort)的Javascript实现 留言:
用C#代码实现: Func<IEnumerable<IComparable>, IEnumerable<IComparable>> quick_sort = null; quick_sort = new Func<IEnumerable<IComparable>, IEnumerable<IComparable>>(l => l.Count() <= 1 ? l : quick_sort(l.Skip(1).Where(t => t.CompareTo(l.ElementAt(0)) < 0)).Concat(new IComparable[] { l.ElementAt(0) }).Concat(quick_sort(l.Skip(1).Where(t => t.CompareTo(l.ElementAt(0)) >= 0))));
2011-05-24 16:00:55
Simon的代码之所不行,是因为它打错了一个字符. 最后的"<="要改成">=" 一开始我以为是什么隐蔽的错误呢, 没想到是这么明显的.
2011-05-24 13:21:02
我解释下Limon提到的python的代码: q_sort= lambda l: l if len(l)<=1 else q_sort([x for x in l[1:] if x<l[0]])+[l[0]]+q_sort([x for x in l[1:] if x<=l[0]]) 首先lambda是用来动态声明一个函数的. 这个函数接受一个参数l, l很明显是python的list类型. 这个函数本身赋值给了等号左边的q_sort. 接下来分析右边的函数: l if len(l)<=1 意思是说如果l的长度小于等于1, 就直接返回l else 后面的部分是如果l的长度大于1就会执行 接下来分析else后面的部分: 采用l的第一个元素l[0]为"基准". 有两个+号,把三段list连接为一个list: 第一段list是小于l[0]的元素快速排序的结果 第二段list就只包含l[0]一个元素 第三段list是大于l[0]的元素快速排序的结果. 三段加起来就是最终的结果, 并且是排好序的. 其中第一段和第三段的生成过程中, 递归调用了q_sort本身. 但是, Simon的这个代码是无法得出正确的结果的! 也就是说是错的! 以下是示例运行结果: >>> q_sort= lambda l: l if len(l)<=1 else q_sort([x for x in l[1:] if x<l[0]])+[l[0]]+q_sort([x for x in l[1:] if x<=l[0]]) >>> print q_sort([2,3,5,6,3,1,8,5]) [1, 2, 1] 接下来我会留言分析下为什么Simon给出的python解决方案是错的.
2011-05-24 13:16:59
留言(4 条)
在 Javascript面向对象编程(二):构造函数的继承 留言:
感觉把面向对象的东西在js上面实现一遍, 增大代码了维护的难度, 而不是减小了维护的难度. 正在思索, 这么做是不是有必要呢?
2011-07-29 22:02:12
在 快速排序(Quicksort)的Javascript实现 留言:
用C#代码实现:
Func<IEnumerable<IComparable>, IEnumerable<IComparable>> quick_sort = null;
quick_sort = new Func<IEnumerable<IComparable>, IEnumerable<IComparable>>(l => l.Count() <= 1 ? l : quick_sort(l.Skip(1).Where(t => t.CompareTo(l.ElementAt(0)) < 0)).Concat(new IComparable[] { l.ElementAt(0) }).Concat(quick_sort(l.Skip(1).Where(t => t.CompareTo(l.ElementAt(0)) >= 0))));
2011-05-24 16:00:55
在 快速排序(Quicksort)的Javascript实现 留言:
Simon的代码之所不行,是因为它打错了一个字符. 最后的"<="要改成">="
一开始我以为是什么隐蔽的错误呢, 没想到是这么明显的.
2011-05-24 13:21:02
在 快速排序(Quicksort)的Javascript实现 留言:
我解释下Limon提到的python的代码:
q_sort= lambda l: l if len(l)<=1 else q_sort([x for x in l[1:] if x<l[0]])+[l[0]]+q_sort([x for x in l[1:] if x<=l[0]])
首先lambda是用来动态声明一个函数的. 这个函数接受一个参数l, l很明显是python的list类型.
这个函数本身赋值给了等号左边的q_sort.
接下来分析右边的函数:
l if len(l)<=1 意思是说如果l的长度小于等于1, 就直接返回l
else 后面的部分是如果l的长度大于1就会执行
接下来分析else后面的部分:
采用l的第一个元素l[0]为"基准".
有两个+号,把三段list连接为一个list:
第一段list是小于l[0]的元素快速排序的结果
第二段list就只包含l[0]一个元素
第三段list是大于l[0]的元素快速排序的结果.
三段加起来就是最终的结果, 并且是排好序的. 其中第一段和第三段的生成过程中, 递归调用了q_sort本身.
但是, Simon的这个代码是无法得出正确的结果的! 也就是说是错的! 以下是示例运行结果:
>>> q_sort= lambda l: l if len(l)<=1 else q_sort([x for x in l[1:] if x<l[0]])+[l[0]]+q_sort([x for x in l[1:] if x<=l[0]])
>>> print q_sort([2,3,5,6,3,1,8,5])
[1, 2, 1]
接下来我会留言分析下为什么Simon给出的python解决方案是错的.
2011-05-24 13:16:59