《快學scala》12章練習答案

2021-07-24 18:23:32 字數 3980 閱讀 5009

最近看了看《快學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 ...