最近看了看《快學scala》,比較好的點在於這本書每一章後面都有一些練習,可以自己去做一下,對於掌握知識來講還是不錯的(像是以前上學後面的習題一樣)。
我不知道**有答案,也沒有認真找過,就自己做了做。
iteye上有乙個人寫了前幾章的答案,可以參考一下,鏈結為:遺憾的是這個人只寫到第九章,我上面的鏈結也是第九章,後面就沒有了。
其實前面的練習我都沒有特別認真的做,簡單寫了寫,也參照了一下上面的部落格(非常感謝),12章是將簡單的高階函式,對於scala這樣講函式式與物件導向很好的結合的語言,高階函式是必須掌握的內容,所以我也就花心思做了做練習,並且將10個題的答案寫了下來。
只能說,我根據題目都按照他的思想實現了內容,至於答案是不是最優的,這應該是不可能的。
僅供參照。
如果有不同,歡迎指點。
題目簡單提一下,可以參照書籍。
這個沒什麼,就是簡單地函式引數的利用而已。
//第一題 lx12_1
def values(func:
(int
)=>
int,low:
int,high:
int)
}//呼叫函式
def func(x:
int)
:int
=x*x
values(func,-5
,5)
練習2:利用reduceleft得到陣列中的最大元素
這個只要每次返回乙個大的值就可以,我用了 if比較大小 懶。。。。
//第二題 lx12_2
def getmaxbyreduceleft(arr:array[
int]):
int=)}
//呼叫函式
val arr=array(1,
2,3,
4,5,
6,7,
2,3,
5)println(getmaxbyreduceleft(arr)
)
我覺得我這個寫的有點問題,我預設的型別是long的,但是練習4說要考慮n<1的情況
因此我就無視了
第三和第四題都是有點問題的
//第三題 lx12_3
//只考慮 n>1 且 n為int的情況的解決
def getfactorialbyreduceleft(num:
long):
long
=//呼叫函式
println(getfactorialbyreduceleft(10:
long
))
這個提示和第二題唯一的不同就是比較的函式的大小而已,不過我用了乙個ans一直記錄函式最大值,這樣子最後才能返回需要的也就是函式的最大值
//第五題 lx12_5
def lx12_5(func:
(int
)=>
int,inputs:seq[
int]):
int=
else})
ans}
//測試函式
def func2(x:
int)=10
*x-x*x
println(lx12_5(func2,
1 to 10
))
第五題剛好反過來,需要求最大值時候的輸入值,只要讓ans記錄輸入值就行了
//第六題 lx12_6
//乙個意思 沒什麼的
def lx12_6(func:
(int
)=>
int,input:seq[
int]):
int=)}
//測試函式
def func3(x:
int)=10
*x println(lx12_6(func3,
1 to 3
))
這個題很有意思,首先,通過 zip操作得到的實際上是乙個元祖為基礎的vector,而進行map的時候不能簡單地map(_+_),因為他不是兩個int,而是乙個tuple2
建立的函式要求能夠在map中去處理,看**。。。
//第七題 lx12_7
val pairs=
(1 to 10
) zip (
11 to 20
)//我們都知道map可以每次去處理乙個值,但是他不接受tuple
//所以ajusttopair剛好解決這個問題,能夠接受tuple2,並返回另乙個函式
def ajusttopair(func:
(int
,int
)=>
int)
=(pair:tuple2[
int,
int]
)=>
//測試函式
println(pairs.map(i=>ajusttopair(_ + _)
(i))
)
這個看看書上的例子很容易就寫出來了
//第八題lx12_8
val tmpstr=array(
"hello"
,"scala"
,"postbird"
)val tmplen=array(5,
5,8)
// val tmplen=array(5,5,7)
println(tmpstr.corresponds(tmplen)
(_.length==_)
)
題目說上一題應該是第七題,也就是使用 zip集合map來實現
當然還是要借助我們的ajusttopair函式的
最後我用了res來記錄,使用foreach結合 && 操作記錄最後是false和true
我寫的比較麻煩,但是也實現了。不知到有沒有別的方式
//第九題lx12_9
//不知道前乙個聯絡指的是 7 還是8 應該是 7 因為7用了zip
//然後用了比較麻煩的實現
val tmpstr_2=array(
"hello"
,"scala"
,"postbird"
)val tmplen_2=array(5,
5,8)
// val tmplen_2=array(5,5,7)
val pairs_2=tmpstr_2 zip tmplen_2
def ajusttopair_2(func:
(string
,int
)=>
boolean)=
(pair:tuple2[
string
,int])
=>
var res:
boolean
=true
pairs_2.map(i=>ajusttopair_2(_.length == _)
(i))
.foreach(b=>res=res&&b)
println(res)
一定是需要換名排程,另外需要科里化,不然太麻煩
但實際上 換名排程我只是了解個皮毛
//第十題 lx12_10
//換名呼叫和科里化是需要的 可以最簡潔的表示
//省略了() 冒號和 => 的空格是一定要有的
def unless(condition:
=>
boolean
)(block:
=>
unit)}
//測試函式
//意思是:除非 到了2,否則就一直輸出
var tmpnum=
10 unless(tmpnum!=2)
我在碼雲存了乙個**片段
git@osc:
快學Scala12章參考練習
1 編寫函式values fun int int,low int,high int 該函式輸出乙個集合,對應給定區間內給定函式的輸入和輸出。比如,values x x x,5,5 應該產出乙個對偶的集合 5,25 4,16 3,9 5,25 分析 輸入是乙個f int int的函式及2個int表示上...
《快學scala》筆記及答案2
package com.zhuxiaoyu.chapter2 import scala.math.bigint object chapter2 將多個語句包含 如 val distance 在這個語句塊中最後一句的返回值作為distance的值。在函式定義中也是最後乙個語句作為函式的返回值,無需re...
《快學Scala》第12章 高階函式 學習筆記
scala混合了物件導向和函式式的特性。在函式式程式語言中,函式時 頭等公民 可以像任何其他型別一樣被傳遞和操作 只需要將明細動作包含在函式當中作為引數傳入即可。本章要點概述 在scala中,可以在變數中存放函式 import scala.math.val num 3.14 valfun ceil ...