《快学Scala》课后习题答案 Unit 12 高阶函数

参考博客

12.1 编写函数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) = {
  for (i <- low to high) yield (i, fun(i))
}
val x = values(x => x * x, -5, 4)   //Vector((-5,25), (-4,16), (-3,9)...
12.2 如何用reduceLeft得到数组中的最大元素?
val array = Array(1, 2, 5, 4, 3)
array.reduceLeft((a, b) => if (a > b) a else b)
12.3 用to和reduceLeft实现阶乘函数,不得使用循环或递归
val n = 9
1 to n reduceLeft(_ * _)
12.4 前一个实现需要处理一个特殊情况,即n<1的情况。展示如何用foldLeft来避免这个需要
val num = -9
(1 to num).foldLeft(1)(_ * _)
12.5 编写函数largest(fun:(Int)=>Int,inputs:Seq[Int]),输出在给定输入序列中给定函数的最大值。举例来说,largest(x=>10*x-x*x,1 to 10)应该返回25.不得使用循环或递归
def largestf(fun: (Int) => Int, inputs: Seq[Int]): Int = {
  val res = inputs.reduceLeft((a, b) => if (fun(a) > fun(b)) a else b)
  fun(res)
  //inputs.map(fun).max
}
largestf(x => 10 * x - x * x, 1 to 10)
12.6 修改前一个函数,返回最大的输出对应的输入。举例来说,largestAt(fun:(Int)=>Int,inputs:Seq[Int])应该返回5。不得使用循环或递归
def largest(fun: (Int) => Int, inputs: Seq[Int]): Int = {
  val res = inputs.reduceLeft((a, b) => if (fun(a) > fun(b)) a else b)
  res
}
largest(x => 10 * x - x * x, 1 to 10)
12.7 要得到一个序列的对偶很容易,比如:val pairs = (1 to 10) zip (11 to 20)假定你想要对这个序列做某中操作—比如,给对偶中的值求和,但是你不能直接使用:pairs.map(_ + )函数 + _ 接受两个Int作为参数,而不是(Int,Int)对偶。编写函数adjustToPair,该函数接受一个类型为(Int,Int)=>Int的函数作为参数,并返回一个等效的, 可以以对偶作为参数的函数。举例来说就是:adjustToPair(_ * _)((6,7))应得到42。然后用这个函数通过map计算出各个对偶的元素之和
/***这个函数不太懂,特别是调用那里,不明白((6,7))要2个括号***/
def adjustToPair(fun: (Int, Int) => Int): ((Int, Int)) => Int = {
  (tuple: (Int, Int)) => fun(tuple._1, tuple._2)
}

val b = adjustToPair(_ * _) 
val c = b(6, 7)             //((6,7))也对
val d = adjustToPair(_ * _)((6,7))
12.8 在12.8节中,你看到了用于两组字符串数组的corresponds方法。做出一个对该方法的调用,让它帮我们判断某个字符串数组里的所有元素的长度是否和某个给定的整数数组相对应
val f = Array("red", "black", "blue")
val g = Array(3, 5, 4)
f.corresponds(g)(_.length == _)     //res5: Boolean = true

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值