《快学Scala》(英文版:《Scala for the Impatient》),代码已传github:
https://github.com/vernonzheng/scala-for-the-Impatient
书为第一版。scala为2.11.4,jdk1.7.45,操作系统Mac OS X Yosemite 10.10.1。
第二章 控制结构与函数
2.1
一个数字如果为正数,则它的signum为1;如果是负数,则signum为-1;如果为0,则signum为0.编写一个函数来计算这个值。
答:
1 2 3 4 5 6 7
| def sigNum(num: Int):Int = { if (num > 0) 1 else if (num < 0) -1 else 0 } println(signum(10000)); println(signum(-22)); println(signum(0));
|
2.2
一个空的块表达式{}的值是什么?类型是什么?
答:
1 2
| scala> val x = {} x: Unit = ()
|
2.3
指出在Scala中何种情况下赋值语句x=y=1是合法的。(提示:给x找个合适的类型定义)
答:
因为赋值语句的值是Unit型,所以x可定义为Unit型。
1 2 3 4 5 6 7 8
| scala> var y = 5 y: Int = 5 scala> var x = {} x: Unit = () scala> x = y= 1 x: Unit = ()
|
2.4
针对下列Java循环编写一个Scala版本:
for(int i=10;i>=0;i—) System.out.println(i);
答:
1 2 3 4 5 6 7 8 9 10 11 12 13
| scala> for(i <- 0 to 10 reverse) println(i) warning: there was one feature warning; re-run with -feature for details 10 9 8 7 6 5 4 3 2 1 0
|
2.5
编写一个过程countdown(n:Int),打印从n到0的数字。
答:
1 2 3 4 5 6 7 8 9 10 11 12
| scala> def countdown(n:Int){ for(i <- 0 to n reverse){ println(i) } } warning: there was one feature warning; re-run with -feature for details countdown: (n: Int)Unit scala> countdown(2) 2 1 0
|
2.6
编写一个for循环,计算字符串中所有字母的Unicode代码的乘积。举例来说,”Hello”中所有字符串的乘积为9415087488L
答:
1 2 3 4 5 6 7 8 9
| scala> def test(str:String):Long = { var result:Long = 1 for(i <- str) result *= i result } test: (str: String)Long scala> test("oh,yeah") res5: Long = 62621117315328
|
2.7
同样是解决前一个练习的问题,但这次不使用循环。(提示:在Scaladoc中查看StringOps)
答:
1 2 3 4 5
| def test(str:String):Long = { var result:Long = 1 str.foreach( ch => {result *= (ch.toLong)}) result }
|
2.8
编写一个函数product(s:String), 计算前面习题中提到的乘积。
答:
1 2 3 4 5
| def product(str:String):Long = { var result:Long = 1 str.foreach( result *= _.toLong ) result }
|
2.9
把前一个练习中的函数改成递归函数。
答:
1 2 3 4 5 6 7 8
| def product(str:String):Long = { var result:Long = 1 if (str.length==1) result = str.head.toLong else result = str.head.toLong * product(str.tail) result }
|
2.10
编写函数计算x^n, 其中n为整数。使用如下的递归定义:
- x^n = y^2,如果
- x^n = x*x^(n-1)
- x^0 = 1
- x^n = 1/x^(-n)
答:
1 2 3 4 5 6
| def getPower(x:Double, n:Int):Double = { if (n == 0 ) 1 else if ( n>0 && n % 2 != 0 ) x * getPower(x, n-1) else if (n >0 && n % 2 == 0 ) getPower (x, n/2) * getPower (x, n/2) else 1/getPower( x, -n) }
|
参考:
《快学Scala》:http://book.douban.com/subject/19971952/
(转载本站文章请注明作者和出处 Vernon Zheng(郑雪峰) – vernonzheng.com ,请勿用于任何商业用途)