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表示上下界 ,输出是一个对偶的集合,每一个对偶对应一个元素x及f(x)的结构,所以想到使用拉链将输入元素集合及其对应运算结果f(x)组合,形成对偶集合,代码如下
object Test {
def main(args: Array[String]): Unit = {
println(values(x=>x*5,-5,5))
}
def values(fun:(Int)=>Int,low:Int,high:Int)= (low to high).zip((low to high).map(fun(_)))
}
输出
2 如何用reduceLeft得到数组中的最大元素?
object Test {
def main(args: Array[String]): Unit = {
println(getMax(Array(3,5,7,15,7,9,-9,14,678,444)))
}
def getMax(arr: Array[Double]) = {
arr.reduceLeft((a, b) => if (a > b) a else b)
}
}
输出
3 用to和reduceLeft实现阶乘函数,不得使用循环或递归
object Test {
def main(args: Array[String]): Unit = {
println(N(10))
}
def N(n: Int) = {
(1 to n).reduceLeft(_*_)
}
}
输出
4 前一个实现需要处理一个特殊情况,即n<1的情况。展示如何用foldLeft来避免这个需要。
foldLeft可以设定一个初始左值,将其设置为1
object Test {
def main(args: Array[String]): Unit = {
println(N(-2))
}
def N(n: Int) = {
(1 to n).foldLeft(1)(_*_)
}
}
当输入n为负值时,输出1 不会报错
5 编写函数largest(fun:(Int)=>Int,inputs:Seq[Int]),输出在给定输入序列中给定函数的最大值。举例来说,largest(x=>10*x-x*x,1 to 10)应该返回25.不得使用循环或递归、
object Test {
def main(args: Array[String]): Unit = {
println(largest(f,1 to 10))
}
def largest(fun:(Int)=>Int,inputs:Seq[Int])={
val s = inputs.reduceLeft((a,b)=>if (fun(a) > fun(b)) a else b)
fun(s)
}
val f=(x:Int)=>10*x-x*x
}
6修改前一个函数,返回最大的输出对应的输入。举例来说,largestAt(fun:(Int)=>Int,inputs:Seq[Int])应该返回5。不得使用循环或递归
这两个题类似 不同的是一个是求值 一个是求索引
object Test {
def main(args: Array[String]): Unit = {
println(largest(f,1 to 10))
}
def largest(fun:(Int)=>Int,inputs:Seq[Int])={
inputs.reduceLeft((a,b)=>if (fun(a) > fun(b)) a else b)
}
val f=(x:Int)=>10*x-x*x
}