module Sort where其实只利用了递归和Haskell强大的列表处理功能。这也不是Haskell的专利,我相信Python或Ruby或Lisp也完全能做到?img src ="http://www.shnenglu.com/chengmeng/aggbug/11424.html" width = "1" height = "1" />
-- Quick Sort Algorithm
quicksort [] = []
quicksort (x:xs) = quicksort [y | y <- xs,y <= x]
++ [x] ++ quicksort [y | y <- xs,y > x]
-- Merge two ordered sequences
merge' [] [] = []
merge' lst [] = lst
merge' [] lst = lst
merge' (x1:xs1) (x2:xs2) =
if x1 < x2
then x1:(merge' xs1 (x2:xs2))
else x2:(merge' (x1:xs1) xs2)
-- Merge Sort Algorithm
mergesort [] = []
mergesort (x:[]) = [x]
mergesort lst =
let parts = splitAt (div (length lst) 2) lst
in merge' (mergesort (fst parts))
(mergesort (snd parts))
module Prime where
prime' [] = []
prime' (x:xs) = x:(prime' (filter (\y -> (mod y x)/=0) xs))
prime n =
prime' [2.. n]
sub is_prime { my ($number) = @_; return (1 x $number) !~ m/\A (?: 1? | (11+?)(?> \1+)) \Z/xms; }
是不是有点匪h思?堪称Perl中的混ؕ代码(Obfuscated Code)。所以正则表辑ּq个玩意Q用得好了不_巨强大无比,可是晦ӆh也不输于机器码。我现在对Perl了解不多Q上面这行正则表辑ּp我郁闷了很久Q刚看到p了:?:?>是什么东西?赶紧dProgramming Perl看,原来是Perl的Extented Regular Expression……恶补了一阵之后回头来琢磨Q终于大致明白其中的道理?br />
原理其实很简单,是最原始的方法:如果要决定正整数N是不是素敎ͼ拿于N的正整数(?开?挨个去除Q如果发现除则表明是合数。当Ӟ0?要特D处理,他们两个都不是素敎ͼ前面正则表达式中??是Zq个目的。?11+?)(?> \1+)开始了循环验的q程。这其中的过E很有意思,最好是拿Perl的re模块来debug一下,只要在文件开头加上use re"debug"成了,执行时会详细的输出整个匹配的q程。我们现在就来跟t一下,在匹配时到底发生了什么好玩的事情?br />
(1 x $number)创徏了一个长度ؓ$numberQ全部由'1'l成的串。首先,(11+?)可以匚w长度不小?的全?1'l成的字W串。假如我们拿"1111"d配,那么首先(11+?)会匹配整个串Qƈ这部分匚w到的内容保存在\1中。然后往下走Q这时第二部分的要求不能满了—??> \1+)。暂且不?>是什么意思,q个表达式的要求是前面匚w到的部分重复出现一ơ以?看到q里可能已经有h明白了,q不是整除么?变态整除!)Q但是目前的匚w不满求:整个串都匚w光了Q只剩下一个\Z了。所以我们唯物主义的正则表达式引擎会backtracing(回溯)Q往回退一步,?11+?)只匹?111"Q但q样q是不行Q只好再往回退Q这时你发现Q\1中的内容?11"Q剩下的部分也是"11"Q匹配成功了。其实这只是4=2*2的另一U说法。注意到函数中的匚wq算W是!~Q整个函数返?。如果一直回退到最?"11")q是匚w不了Q说?number是一个素数?br />
说到q里Q作者的巧思确实值得佩服Q虽然看I了会觉得不q如此。然后还有两个问题没有解冻I是?>?:到底是干什么吃的??>的意思是No backtracing,?:则是Cluster but no grouping?>可以不要Q不影响l果(可能Ҏ率有些媄响,但相信没有h会拿q种办法d定素性的)Q但?:׃可缺了?/font>