快學Scala練習題答案-第2章
scala執行在java虛擬機器上,它在擁抱函數語言程式設計的同時,又沒有廢棄面向物件,這是一種全新的程式設計正規化。本文的內容為基本的控制結構和函式一章的答案。
一個數字如果為正數,則它的signum為1,如果為負數,則signum為-1,如果為0,則signum為0.編寫一個函式來計算這個值。
一個空的表示式{}的值是什麼?型別是什麼?
在scala中,{}塊包含一系列表示式,其結果也是一個表示式,塊中最後一個表示式的值就是塊的值。
如圖所示,型別是Unit型別,它的值就是(), 等同於Java中的void。
指出Scala中何種情況下賦值語句x=y=1是合法的。
賦值語句是Unit型別的,所以應該把x賦值成Unit型別。
針對下列Java迴圈編寫一個Scala版:
for(int i=10; i>=0;i–) System.out.println(i);
編寫一個過程countdown(n:Int),列印從n到0的數字
或者寫成:
編寫一個for迴圈,計算字串中所有字母的Unicode程式碼的乘積。舉例來說,”Hello”中所有字串的乘
積為9415087488L
同樣是解決前一個練習的問題,但這次不使用迴圈。
編寫一個函式product(s:String), 計算前面練習中提到的乘積。
把前一個練習中的函式改成遞迴函式。
以object形式來執行
object Test9{
def main(args: Array[String]){
val str = "hello"
var result = 1
result = product(str)
println(result)
}
def product(s:String) : Int = {
if(s.length == 1){
s(0).toInt
}else{
s(0).toInt * product(s.substring(1 ));
}
}
}
執行: scala TestQ9
結果: 714668928
編寫函式計算
xn ,其中n是整數,使用如下的遞迴定義:
-xn=y2 ,如果n是正偶數的話,這裡的y=xn/2
-xn=x⋅xn−1 , 如果n是正奇數的話
-x0=1
-xn=1/x−n ,如果n是負數的話
不得使用return語句
object Test10{
def main(args: Array[String]){
println(pow(5,2))
println(pow(5.toDouble,0))
println(pow(5.toDouble,1))
println(pow(5.toDouble,-1))
}
def pow(x:Double,n:Int) : Double = {
if(n == 0){
1
}else if(n<0){
1/pow(x,-n)
}else if (n % 2 ==0){
pow(x,n/2)*pow(x,n/2)
}else{
pow(x,n-1)*x
}
}
}
輸出:
25.0
1.0
5.0
0.2