关键代码+运行截图
1.编写函数values(fun(Int)=>Int, low:Int,high: Int)该函数输出一个集合,对应给定区间
内给定函数的输入和输出。比如values(x=>x*x,-5,5) 应该产生集合(-5,25) (-4,16) ….
def values(fun:(Int)=>Int,low:Int,high:Int):List[(Int,Int)]={
var col=List[(Int,Int)]()
for(a <-low to high){
col=(a,fun(a))::col
}
return col
}
2.读下图的程序,将其改为高阶函数的形式 。
def formatAbs(func:(Int)=>Int,a:Int)={
val msg="The absolute value of %d is %d"
func(a)
}
def main(args: Array[String]): Unit = {
println(formatAbs((n:Int)=>if(n<0) -n else n,-42))
}
3.用correspond方法让我们判断某个字符串数组里面所有元素的长度是否和某个给定的整数数
组一致。
def main(args: Array[String]): Unit = {
val a=Array("aa","bb","cc")
val b=Array(2,2,2)
val c=Array(1,2,3)
println(a.corresponds(b)(_.length==_))
println(a.corresponds(c)(_.length==_))
}
4.def getGreetingFunc(msg: String) = (name: String) => println(msg + “,” + name)
在这个表达式中,根据闭包的定义,找出非局部变量。
msg
5.假设某国的货币有若干面值,现给一张大面值的货币要兑换成零钱,问有多少种兑换方式。
def changmmoney(money:Int,change:List[Int]): Int ={
if(0==money) return 1//完成一种换法
if(money<0||change.size==0) return 0//该种换法没有成功
changmmoney(money,change.tail)+changmmoney(money-change.head,change)
//前者为按面值种类递归,每次删掉一种面值,求只用其余面值能得到的换法数量
//后者为开始兑换,每次都用一种面值进行兑换,能将money减为0的返回1
//单独看后者递归,都是用同一种面值进行减法,但与前者相结合,所有递归下来就变成了每种面值都尝试过
}
def main(args: Array[String]): Unit = {
println(changmmoney(10,List(5,10)))
println(changmmoney(10,List(1,2,5,10)))
}
6.写一个递归函数,来获取第n个斐波那契数,前两个斐波那契数0 和 1,第n个数总是等于前
两个数的和——序列开始为0,1,1,2,3,5
def fib(n:Int,a:Int,b:Int): Int ={
if(n==1) return a
fib(n-1,b,a+b)
}
def main(args: Array[String]): Unit = {
println(fib(6,0,1))
}
7.def partial[A,B,C](a: A, f:(A,B) => C): B => C = (b: B) =>?
函数partial 有三个类型参数A,B,C 它带有两个参数,参数f本身是一个有两个参数返回值为C的
函数,函数partial返回值类型也是函数,类型为B=>C
def partial[A,B,C](a:A, f:(A,B) => C):B=>C=(b:B)=>{
b[C]//匿名函数,参数是B类型,返回C类型
}