Scala学习手册(Learning Scala)第四章习题

---恢复内容开始---

1、写一个函数,给定一个圆的半径,计算这个圆的面积。

scala> def area(r:Double):Double = r*r*3.14area: (r: Double)Doublescala> area(5)res30: Double = 78.5

也可以使用math.pow(r,2)来计算平方

2、对练习1中的函数提供一个替代形式,将半径作为一个String,如果调用这个函数时提供了一个空String会发生什么?

scala> def ares(r:String):Double = {| r.isEmpty match {| case true => 0| case false => math.pow(r.toDouble,2)*math.Pi| }| }ares: (r: String)Doublescala> ares("534")res35: Double = 895843.994727051scala> ares("")res36: Double = 0.0

3、写一个递归函数,可以5、10、15....地打印从5到50的值,但不要使用for或while循环,可以实现尾递归吗?

scala> @annotation.tailrec| def printnum(start:Int,max:Int):Unit = {| if(start <= max){| println(start)| printnum(start+5,max)| }| }printnum: (start: Int, max: Int)Unitscala> printnum(5,20)5101520

4、写一个函数,取毫秒值,返回一个字符串,按天、小时、分和秒描述这个值,输入值的最近类型是什么呢?

object Point{def main(args: Array[String]): Unit = {val tm:String = "1502036122000"val a = tranTimeToLong(tm.toLong)println(a)}def tranTimeToLong(tm:Long) = {val secs = tm / 1000val days = secs / (24*60*60)val hours = (secs % (24*60*60)) / (60*60)val minutes = (secs % 3600 ) / 60val seconds = secs % 60s"$days days,$hours hours, $minutes minutes,$seconds seconds"}}

5、写一个函数,计算第一个值以第二个值为指数的幂。首先试着用math.pow来写这个函数,然后用你自己的算式来实现。你使用了变量吗?有没有方法只使用不可变的数据?你选择一个足够大的数值类型了吗?

scala> def cal(v1:Double,v2:Double):Double = math.pow(v1,v2)cal: (v1: Double, v2: Double)Doublescala> cal(5,10)res38: Double = 9765625.0

尾递归

@annotation.tailrecdef pow(x:Double,y:Int,accum:Double = 1):Double = {if (y < 1) accumelse pow(x,y-1,accum * x)}val x:Double = 5val y:Int = 10print(pow(x,y))

6、写一个函数,计算一对2D点(x和y)之差,并把结果返回为一个点。提示:这里很适合使用元组。

def cal(v1:(Int,Int),v2:(Int,Int)):(Int,Int) = {(v2._1 - v1._1,v2._2 - v1._2)}cal((3,4),(8,9))

---恢复内容结束---

posted @ 2019-10-15 17:14  Keep-Smile  阅读(1078)  评论(0编辑  收藏  举报