59.scala编程思想笔记——列表和递归
欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50458713
源码下载连接请见第一篇笔记。
在几乎所有情况下,都应该选择Vector作为序列容器,因为会以最高效的方式执行大多数操作。有时,Scala 会选择List.
如下:
scala>Seq(1,3,5,7)
res1: Seq[Int] = List(1, 3, 5, 7)
List针对称为递归的特殊类型的操作进行了优化。在递归中,对序列的第一个元素执行操作,然后在操作内部调用同一个方法,并将序列中剩余的部分传递给该方法。
例如:
def rPrint(s:Seq[Char]):Unit = {
print(s.head)
if(s.tail.nonEmpty)
rPrint(s.tail) // Recursive call
}
rPrint("Recursion")
执行输出如下:
Recursion
其中head调用返回第一个元素,而tail会产生剔除第一个元素后的剩余序列。
递归求和如下:
import com.atomicscala.AtomicTest._
def sumIt(toSum:List[Int], sum:Int=0):Int =
if(toSum.isEmpty)
sum
else
sumIt(toSum.tail, sum + toSum.head)
sumIt(List(10, 20, 30, 40, 50)) is 150
不过在,Scala的集合中有一个内建的sum,其实可以无需编写sumIt,如下:
import com.atomicscala.AtomicTest._
List(10, 20, 30, 40, 50).sum is 150
Vector(10, 20, 30, 40, 50).sum is 150
Seq(10, 20, 30, 40, 50).sum is 150
Set(10, 20, 30, 40, 50, 50, 50).sum is 150
(10 to 50 by 10).sum is 150