第十二章 高阶函数 课后习题

1. 编写函数values(fun:(Int)=>Int,low:Int,high:Int),该函数输出一个集合,对应给定区间内给定函数的输入和输出。比如,values(x=>x*x,-5,5)应该产出一个对偶的集合(-5,25),(-4,16),(-3,9),…,(5,25)
def main(args: Array[String]): Unit = {
     val tuples = println(values(x => x * x, 2, 5).toString)
  }

  def values(fun:Int => Int,low:Int,high:Int)={
    for (i <- low to high)yield (i,fun(i))
  }
2. 如何用reduceLeft得到数组中的最大元素?
 val arr = Array(1,2,3,4,8,5)
 val i: Int = arr.reduceLeft((x, y)=>if (x>y) x else y )
3. 用to和reduceLeft实现阶乘函数,不得使用循环或递归
  val num =5
  println(1 to num reduceLeft ((x, y) => x * y))
4. 前一个实现需要处理一个特殊情况,即n<1的情况。展示如何用foldLeft来避免这个需要
  val num2 = -5
  println((1 to num2).foldLeft(1)(_ * _))
5. 编写函数largest(fun:(Int)=>Int,inputs:Seq[Int]),输出在给定输入序列中给定函数的最大值。举例来说,largest(x=>10x-xx,1 to 10)应该返回25.不得使用循环或递归
def largest(fun:(Int)=>Int,inputs:Seq[Int])={
    //方式1
    inputs.map((fun(_))).max
  }

  def largest2(fun:(Int)=>Int,inputs:Seq[Int])={
    //方式2
    val key = inputs.reduceLeft((x,y) => if(fun(x)>fun(y)) x else y)
    fun(key)
  }
6. 修改前一个函数,返回最大的输出对应的输入。举例来说,largestAt(fun:(Int)=>Int,inputs:Seq[Int])应该返回5。不得使用循环或递归
 def largest2(fun:(Int)=>Int,inputs:Seq[Int]):Int={
     inputs.reduceLeft((x,y) => if(fun(x)>fun(y)) x else y)
  }
7. 要得到一个序列的对偶很容易,比如:val pairs = (1 to 10) zip (11 to 20)假定你想要对这个序列做某中操作—比如,给对偶中的值求和,但是你不能直接使用:pairs.map(_ + )函数 + _ 接受两个Int作为参数,而不是(Int,Int)对偶。编写函数adjustToPair,该函数接受一个类型为(Int,Int)=>Int的函数作为参数,并返回一个等效的, 可以以对偶作为参数的函数。举例来说就是:adjustToPair(_ * _)((6,7))应得到42。然后用这个函数通过map计算出各个对偶的元素之和。
    var list=List[Int]()

    
    def adjuctToPair(fun:(Int,Int) =>Int)(tup:(Int,Int))={
       list = fun(tup._1,tup._2) :: list
    }

    val pair: immutable.Seq[(Int, Int)] = (1 to 10) zip(11 to 20)

    for ((a,b) <- pair) {
      adjuctToPair(_ * _)(a,b)
    }

    //对list中的各个对偶的乘积求和
    def map(fun:(Int,Int) =>Int)={
      list.reduceLeft(fun)
    }

    println(map(_ + _))
8. 在12.8节中,你看到了用于两组字符串数组的corresponds方法。做出一个对该方法的调用,让它帮我们判断某个字符串数组里的所有元素的长度是否和某个给定的整数数组相对应
    val a = Array("asd","df","aadc")
    val b = Array(3,2,4)
    val c = Array(3,2,1)

    println(a.corresponds(b)((x, y) => x.length == y))
    println(a.corresponds(c)((x, y) => x.length == y))
9. 不使用柯里化实现corresponds。然后尝试从前一个练习的代码来调用。你遇到了什么问题?
10. 实现一个unless控制抽象,工作机制类似if,但条件是反过来的。第一个参数需要是换名调用的参数吗?你需要柯里化吗?
//block可以自定义不返回内容的参数
def unless(condition: =>Boolean)(block: =>Unit){
    if (!condition){
      block
    }
  }
 
  var x = 10
  unless(x == 0){
    x -= 1
    println(x)
  }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值