简短的几行代码就完成了快速排序:
def qsort: List[Int] => List[Int] = {
case Nil => Nil
case pivot :: tail =>
val (smaller, rest) = tail.partition(_ < pivot)
qsort(smaller) ::: pivot :: qsort(rest)
}
这几行代码很美,美不胜收。
我喜欢把这种风格里定义的sqort叫做对象,函数对象;
它的类型是List[Int] => List[Int],这是个函数类型,接受一个List[Int]参数,返回一个List[Int] 结果;
模式匹配的第二个case pivot :: tail用来匹配至少有一个元素的List,如果匹配,pivot(轴)将被赋值为第一个元素;
val (smaller, rest) = tail.partition(_ < pivot)
这行代码很强大,partition为高阶函数,接受一个返回值为布尔值的函数。_ < pivot 为语法糖,是(i:Int)=>i<pivot匿名函数的简写;
这里的partition返回一个二元组(List[Int],List[Int]),smaller包含所有小于pivot的元素,rest包含tail中所有大于等于pivot的元素。
qsort(smaller) ::: pivot :: qsort(rest),这行代码很直观,虽然执行顺序有点拗;
直观的地方在于书写的顺序,小的在前大的在后,然后用:::和::符号链接起来;
执行的时候是qsort(rest).::(pivot),就是把pivot放在qsort(rest)的结果(是个List)的首位;
用括号表示优先级:(qsort(smaller) ::: (pivot :: qsort(rest)))
完全写法:(qsort(rest).::(pivot)).:::(qsort(smaller)) 这里的::和:::都是方法,还是简写好,形象直观,也是最终结果的表现形式。
qsort(smaller) ::: pivot :: qsort(rest) 这行代码很不容易理解,怎么qsort还没有定义完就能调用了?这是我第一次接触递归的困惑。
假设qsort已经在别的地方定义完,在这里调用,则很容易理解;qsort在自己定义的地方调用自己,则显得很抽象,仿佛一口不见底的井。
我是这样理解,定义一个规则来把一个集合处理为prePart和nextPart两部分,然后把这个规则分别应用在这两部分上。
分享到:
相关推荐
《在Scala中进行编程:全面的分步指南》(Programming in Scala: A comprehensive step-by-step guide)是一本关于Scala编程语言的权威教材。这本书的独特之处在于它的共同作者是Scala语言的设计师Martin Odersky,...
Scala:Applied Machine Learning by Pascal Bugnion English | 23 Feb. 2017 | ISBN-13: 9781787126640 | 1843 Pages | EPUB/PDF (conv) | 33.15 MB Leverage the power of Scala and master the art of building, ...
"Scala: Guide for Data Science Professionals (Learning Path)" ASIN: B06XCJVY21, eISBN: 1787282856 | 2017 | True PDF | 1100 pages | 15 MB Scala will be a valuable tool to have on hand during your data...
Glicko2系统基于微积分和概率论,考虑了比赛结果的不确定性,能更好地处理频繁的比赛和快速的能力变化。 在Scala中实现Glicko2排名系统,开发者可以利用这门多范式编程语言的特性,如函数式编程、面向对象编程和...
【课程大纲】第1讲-Spark的前世今生第2讲-课程介绍、特色与价值第3讲-Scala编程:基础语法第4讲-Scala编程:条件控制与循环第5讲-Scala编程:函数入门第6讲-Scala编程:函数入门之默认参数和带名参数第7讲-Scala编程...
creative-scala:快速,图形化,有趣的Scala编程介绍
在"scala: scala代码"的描述中,我们可以推测这是一个关于Scala编程语言的学习资源或者项目源代码。 1. **面向对象编程**:Scala是基于Java虚拟机(JVM)的语言,因此它兼容Java的所有类库。它支持类、对象和继承等...
"CrossCuttingConcern_Scala" 可能就是这样一个项目,它展示了如何在 Scala 中利用第三方库如 Scalaz 或 Aspects4s 来实践 AOP。 Scalaz 是一个强大的 Scala 库,提供了许多函数式编程工具,包括类型类、Monads 和...
Programming Scala: Tackle Multi-Core Complexity on the Java Virtual Machine by Venkat Subramaniam Scala is an exciting, modern, multi-paradigm language for the JVM. You can use it to write ...
Testcontainers-scala 用于Scala包装器,允许使用容器进行功能/... 行动中的Testcontainers-scala: ://dimafeng.com/2016/08/01/testcontainers-selenium/松弛设置对于scalatest用户: libraryDependencies + = " ...
将org.plotly-scala::plotly-almond:0.8.1依赖项添加到笔记本中。 (最新版本:)然后初始化plotly-scala,并像使用它一样使用它 import $ivy . `org.plotly-scala::plotly-almond:0.8.1` import plotly . _ import
读书笔记:scala 快速学习
赠送jar包:scala-parser-combinators_2.11-1.0.4.jar; 赠送原API文档:scala-parser-combinators_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-parser-combinators_2.11-1.0.4-sources.jar; 包含翻译后的API...
赠送jar包:scala-xml_2.11-1.0.4.jar; 赠送原API文档:scala-xml_2.11-1.0.4-javadoc.jar; 赠送源代码:scala-xml_2.11-1.0.4-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.11-1.0.4.pom; 包含翻译后的API...
赠送jar包:scala-xml_2.11-1.0.1.jar; 赠送原API文档:scala-xml_2.11-1.0.1-javadoc.jar; 赠送源代码:scala-xml_2.11-1.0.1-sources.jar; 赠送Maven依赖信息文件:scala-xml_2.11-1.0.1.pom; 包含翻译后的API...
【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...
【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...
【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...
【课程大纲】第1讲-Spark的前世今生 共12页第2讲-课程介绍、特色与价值 共13页第3讲-Scala编程详解:基础语法 共8页第4讲-Scala编程详解:条件控制与循环 共7页第5讲-Scala编程详解:函数入门 共5页第6讲-Scala编程...