《快学scala》习题解答-第二章-控制结构和函数

《快学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 ,请勿用于任何商业用途)