快学Scala12章参考练习

 

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
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值