高階函數在scala中的表現形式是接受函數爲參數的函數
- 編寫函數values(fun:(Int)=>Int,low:Int,high:Int),該函數輸出一個集合,對應給定區間內給定函數的輸入 和輸出。比如,values(x=>x*x,-5,5)應該產出一個對偶的集合(-5,25),(-4,16),(-3,9),…,(5,25)
def values(fun:(Int)=>Int,low:Int,high:Int)={
val s=for(i<- low to high) yield{
fun(i);
}
val d = low to high;
d.zip(s);
}
2、如何用reduceLeft得到數組中的最大元素
def makemax(arr:Array[Int])={
println( arr.reduceLeft((a,b)=>if(a>b) {a} else { b }));
}
3.用to和reduceLeft實現階乘函數,不得使用循環或遞歸
println((1 to 9).reduceLeft((a,b)=> a*b));
- 前一個實現需要處理一個特殊情況,即n<1的情況。展示如何用foldLeft來避免這個需要
println((1 to 1).foldLeft(1)(_*_));
- 編寫函數largest(fun:(Int)=>Int,inputs:Seq[Int]),輸出在給定輸入序列中給定函數的最大值。舉例來說,largest(x=>10*x-x*x,1 to 10)應該返回25.不得使用循環或遞歸
def largest(fun:(Int)=>Int,inputs:Seq[Int])={
val s=inputs.reduceLeft((a,b)=>if(fun(a)>fun(b)) {a} else {b});
fun(s);
}
6.13.6 修改前一個函數,返回最大的輸出對應的輸入。舉例來說,largestAt(fun:(Int)=>Int,inputs:Seq[Int])應該返回5。不得使用循環或遞歸
def largest(fun:(Int)=>Int,inputs:Seq[Int])={
val s=inputs.reduceLeft((a,b)=>if(fun(a)>fun(b)) {a} else {b});
s;
}
7.要得到一個序列的對偶很容易,比如:
val pairs = (1 to 10) zip (11 to 20)
假定你想要對這個序列做某種操作—比如,給對偶中的值求和,但是你不能直接使用:
pairs.map(_ + _)
函數_ + _ 接受兩個Int作爲參數,而不是(Int,Int)對偶。編寫函數adjustToPair,該函數接受一個類型爲(Int,Int)=>Int的 函數作爲參數,並返回一個等效的, 可以以對偶作爲參數的函數。舉例來說就是:adjustToPair(_ * _)((6,7))應得到42。然後用這個函數通過map計算出各個對偶的元素之和
def adjustToPair(fun:(Int,Int) => Int)={
(pairs : (Int,Int)) => fun(pairs._1,pairs._2)
}
8.在12.8節中,你看到了用於兩組字符串數組的corresponds方法。做出一個對該方法的調用,讓它幫我們判斷某個字符串數組裏的所有元素的長度是否和某個給定的整數數組相對應
val arraystring=Array("a","aa","bbb","ccccd");
val arrayint=Array(1,2,3,4);
val d=arraystring.corresponds(arrayint)((a,b) =>if(a.length()==b) true else false )
- 不使用柯里化實現corresponds。然後嘗試從前一個練習的代碼來調用。你遇到了什麼問題
沒有柯里化則不能使用前一個練習裏的代碼方式來調用
- 實現一個unless控制抽象,工作機制類似if,但條件是反過來的。第一個參數需要是換名調用的參數嗎?你需要柯里化嗎?
def unless(conditions: => Boolean)(block: => Unit)={
if(!conditions)
block;
}
val e=1;
val f=3;
unless(e == f){
println(1);
}
需要換名和柯里化