快速业务通道

冒号课堂§4.1:函数范式 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-16
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来试试——”

-- 快速排序法的Haskell实现 qsort :: (Ord a) => [a] -> [a]--函数声明 qsort[] = []               --递归终点 qsort(pivot : rest) = qsort[x| x <- rest, x < pivot]   --对前面的子列递归               ++ [pivot]               ++ qsort[x| x <- rest, x >= pivot] --对后面的子列递归

冒号课堂§4.1:函数范式(4)

时间:2011-06-25 BlogJava xyz98

叹号几不能信:“竟然可以如此精炼?”

“上面的Java代码很难再精简了,但与Haskell代码相比还是太冗长了。后者省去了所有的赋值、迭代和流程控制,只有单纯的递归,反映了典型的函数式特征。”冒号解说着,“鉴于你们对Haskell不太熟悉,我稍微解释一下。第一步,声明函数类型[3]:同类型列表之间的变换,其中Ord可类比Java中的Comparable,以保证列表元素之间能进行比较;第二步,声明递归终点:空列排序后仍是空列;第三步,描述递归原则:基准元素pivot与剩余子列rest进行排序后的列表,正是将小于基准的子列和超过基准的子列分别排序,中间插入基准元素后的结果。”

句号思有所得,不禁喜形于色:“我明白了,这两段代码生动地反映了命令式编程与声明式编程之间的差别:前者需要指定计算的过程,后者只需指定计算的原则。一个着重微观的细节,一个着重宏观的方向,自有繁简之别。”

冒号亦有所慰:“非常好!类似的话我以前也说过,但你们自己说的才是真正的收获啊。我们还提过,过程式与函数式的差别同时也是机器思维与数学思维的差别。不妨对比Haskell表达式与数学中的集合表达式,它们是多么地相近!”

黑板上出现两行式子——

数学表达式:   {x| x ∈ rest, x < pivot} Haskell表达式:[x| x <- rest, x < pivot]

逗号仔细打量着:“嗯,的确像,跟哥俩似的,连符号<-都是仿照集合属于符∈的。”

“还有另一种表达方法。”冒号又添加了一行——

Haskell表达式2:(filter (< pivot) rest)

“虽然与前一表达式的简洁度相差无几,但可读性更强。filter即是过滤,将列表rest中的元素进行筛选,条件是小于基准元素。”冒号讲解道。

问号略感迷惑:“(< pivot)的用法看起来有

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号