« taoqinghua | 首页 | R »

Tyler Long

留言(4 条)

Javascript面向对象编程(二):构造函数的继承 留言:

感觉把面向对象的东西在js上面实现一遍, 增大代码了维护的难度, 而不是减小了维护的难度. 正在思索, 这么做是不是有必要呢?

快速排序(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))));

快速排序(Quicksort)的Javascript实现 留言:

Simon的代码之所不行,是因为它打错了一个字符. 最后的"<="要改成">="
一开始我以为是什么隐蔽的错误呢, 没想到是这么明显的.

快速排序(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解决方案是错的.