scala 系列20190202
今天看到一篇關於 scala 入門基礎的提問點,我呢,就在這裡簡單做一下釋疑,純粹是為了拋磚引玉,特別期待各位同行的不吝賜教
我先來貼一下原帖的提問點:
- 1、一個數字如果是正數,則它的 signum 為1;如果是負數,則 signum 為 -1;如果是0,則 signum 為0.編寫一個函式來計算這個值
- 2、一個空的塊表示式{} 的值是什麼?型別是什麼?
- 3、指出在 Scala 中何種情況下賦值語句 x=y=1 是合法的。(提示:給 x 找個合適的型別定義)
- 4、針對下列 Java 迴圈編寫一個 Scala 版 for(int i =10; i >= 0; i--) System.out.println(i);
- 5、編寫一個過程 countdown(n: Int),列印從 n 到 0 的數字
- 6、編寫一個 for 迴圈,計算字串中所有字母的 Unicode 程式碼的乘積。舉例來說,“Hello” 中所有字元的乘積為 9415087488L
- 7、同樣是解決前一個練習的問題,但這次不使用迴圈(提示:在 Scaladoc 中檢視 StringOps)
- 8、編寫一個函式 product(s: String),計算前面練習中提到的乘積
- 9、把前一個練習中的函式改成遞迴函式
- 10、編寫函式計算 x^n,其中 n 是整數,使用如下的遞迴定義:
x^n = y^2,如果 n 是正偶數的話,這裡的 y = x^(n/2);
x^n = x*x^(n-1),如果 n 是正奇數的話;
x^0 =1;x^n = 1/x^(-n),如果 n 是負數的話;不得使用 return 語句
我們一條一條來看一下:
- 這第一題我沒大明白什麼是 signum,所以這個先放下,留給各位同行大神來解答嘍,剛好也給我講講哦,哈哈哈
-
- 首先我們知道,x=y=1 這是肯定不對的,因為它實際上是這樣解析的 x=(y=1),而 y=1 是賦值語句,其返回值是 Unit,所以就相當於是將一個 Unit 賦給 x 了,但是文中又提示給 x 找個合適的型別定義,因此我們只需要將 x 給宣告為 var 型別即可
var y = 0; var x = y = 1;
- 這個嘛就比較簡單了
for( i <- 0 to 10 ) println(i);
- 首先要說明一下什麼是過程,它與函式有什麼區別?
在 scala 中對於不返回值的函式有特殊的表示法,如果函式體包含在花括號當中,但是沒有前面的 = 號,那麼返回型別就是 Unit,這樣的函式就被稱為過程(procedure),過程不返回值,我們呼叫它僅僅是為了它的副作用
由於過程不返回任何值,所以我們可以省略 = 號
所以知道了這一點後,我們再來實現題中的要求
def coutdown(n : Int){ for( i <- (n + 1) until(0,-1)) println(i); }
注意這裡不要寫成 for(i <- 0 to 10)
,這樣並不符合題意
- 這道題也是有一個陷阱的,就是在宣告 s 的時候一定要宣告為 Long 型,只要知道這一點後,就比較簡單了
def countUnicodeMutiple(str : String) = { var s : Long = 1; for(i <- str){ s *= i.toInt; println(s); } }
然後呼叫即可
後三道題我先放下,公司今天(2019年2月2日 16:39:45)走的都沒人了,數我離家最遠,屬我最後一個離開,哎,我也寫不下去了,要收拾收拾回家了(好難受,喜歡公司裡的一個女的,但是人家特別討厭我;不說了,明年見)