冒号课堂§4.1:函数范式 - 编程入门网
list[j]; list[j] = tmp;
}
// 找到分割点j,递归
qsort(list, low, j);
qsort(list, j + 1, high);
}
}
“请问这里用到了哪些编程范式?”冒号提问。 叹号心想,有何难哉?遂答:“既然是用Java实现的,自然少不了OOP。同时为了使算法更具普适性,还用到了泛型编程。” “你好像忘记了最重要的过程式,反倒是OOP的色彩极淡。”冒号显然不满意他的答案。 叹号不解:“不是说Java是100%的OOP语言吗?” 冒号颇为不屑:“不要轻信这种浮浅之论。且不说Java的基本类型(primitive type)不属于类(class),本就不是100%的OOP,即使是100%的OOP,那与过程式也不矛盾啊。此例中的Sorter类连一个实例成员(instance member)也没有,唯一与OOP沾边的是作为interface的Comparable,在C中也可用函数指针代替。如果不考虑泛型式的特征,本例无论用Java还是用C,并没有本质差别。事实上,对于这类纯算法的问题,OOP范式本无太多用武之地。换句话说,quicksort虽然是通过以OOP著称的Java来实现的,但用的主要还是过程式的思想和方法。” 问号赶紧问道:“还能用其他范式来实现吗?” 此问正合冒号之意:“我们改用纯函数式语言Haskell来试试——”
冒号课堂§4.1:函数范式(4)时间:2011-06-25 BlogJava xyz98叹号几不能信:“竟然可以如此精炼?” “上面的Java代码很难再精简了,但与Haskell代码相比还是太冗长了。后者省去了所有的赋值、迭代和流程控制,只有单纯的递归,反映了典型的函数式特征。”冒号解说着,“鉴于你们对Haskell不太熟悉,我稍微解释一下。第一步,声明函数类型[3]:同类型列表之间的变换,其中Ord可类比Java中的Comparable,以保证列表元素之间能进行比较;第二步,声明递归终点:空列排序后仍是空列;第三步,描述递归原则:基准元素pivot与剩余子列rest进行排序后的列表,正是将小于基准的子列和超过基准的子列分别排序,中间插入基准元素后的结果。” 句号思有所得,不禁喜形于色:“我明白了,这两段代码生动地反映了命令式编程与声明式编程之间的差别:前者需要指定计算的过程,后者只需指定计算的原则。一个着重微观的细节,一个着重宏观的方向,自有繁简之别。” 冒号亦有所慰:“非常好!类似的话我以前也说过,但你们自己说的才是真正的收获啊。我们还提过,过程式与函数式的差别同时也是机器思维与数学思维的差别。不妨对比Haskell表达式与数学中的集合表达式,它们是多么地相近!” 黑板上出现两行式子——
逗号仔细打量着:“嗯,的确像,跟哥俩似的,连符号<-都是仿照集合属于符∈的。” “还有另一种表达方法。”冒号又添加了一行——
“虽然与前一表达式的简洁度相差无几,但可读性更强。filter即是过滤,将列表rest中的元素进行筛选,条件是小于基准元素。”冒号讲解道。 问号略感迷惑:“(< pivot)的用法看起来有 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |