美文网首页
2020-11.05-Scala-25(高阶函数练习题)

2020-11.05-Scala-25(高阶函数练习题)

作者: 冰菓_ | 来源:发表于2020-11-07 12:26 被阅读0次

    1.案例一

    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 value = function0(x => x * x, -5, 5)
           println(value)
    
    
      }
      //1.理解题意
      def  function0(f:Int=>Int,low: Int, high: Int)={
                 //创建一个可变集合
          var array = ListBuffer[(Int,Int)]()
          low to high foreach(data=>
              //归纳  += :+  适用场合
               array.append( (data ,f(data)))
             )
             array
      }
    

    案例二

    如何用reduceLeft得到数组中的最大元素?

      def main(args: Array[String]): Unit = {
           var array = Array(1,2,3,4,5,6,7,88,100,123,14444)
           println(array.reduceLeft(function1))
    
    
      }
      //使用泛型表示
       def function1[S,T](num:S,num2:T)={
               if(num.toString.toInt.isInstanceOf[Int] && num2.toString.toInt.isInstanceOf[Int]){
               if(num.toString.toInt > num2.toString.toInt )  num  else  num2}
               else  throw new  Exception
       }
    

    案例三

    用to和reduceLeft实现阶乘函数,不得使用循环或递归

      def main(args: Array[String]): Unit = {
        println(function3(12))
    
    
      }
      
       def function3(num :Int)={
           if(num<= 0) {throw  new Exception}
           (1 to num ).reduceLeft(_ * _)
       }
    

    案例四

    编写函数largest(fun: (Int) => Int, inputs: Seq[Int]),输出在给定输入序列中给定函数的最大值。举例来说,largest(x => 10 * x - x * x, 1 to 10)应该返回25。不得使用循环或递归

    方法一

      def main(args: Array[String]): Unit = {
          println(function4(x => 10 * x - x * x, 1 to 10))
      }
       def function4(f:Int=>Int,inputs:Seq[Int])={
             //考虑使用一个变量接收这个最大值
             var max =0;
            for(index<-inputs){
                if(max < f(index))  max = f(index)
            }
            max
       }
    

    方法二

    def main(args: Array[String]): Unit = {
          println(function5(x => 10 * x - x * x, 1 to 10))
      }
      
       def function5(f:Int=>Int,inputs:Seq[Int])={
              inputs.map(f).max
       }
    

    案例五

    修改前一个函数,返回最大的输出对应的输入。举例来说,largestAt(fun: (Int) => Int, inputs: Seq[Int])应该返回5。不得使用循环或递归

    方法一

      def main(args: Array[String]): Unit = {
              println(function6(x => 10 * x - x * x, 1 to 10))
      }
    
      def function6(f: Int => Int, inputs: Seq[Int]) = {
        //考虑使用元组,元组实现了(k,v)形式k相当于索引
        var result = inputs.map(data => (data, f(data)))
          .reduce((data1, data2) =>
            if (data1._2 < data2._2) data2 else data1
          )
        result._1
      }
    

    方法二:实现一种简洁的写法!!!!! ----我竟然没有意识到

      def main(args: Array[String]): Unit = {
              println(function6(x => 10 * x - x * x, 1 to 10))
      }
    
      def function6(f: Int => Int, inputs: Seq[Int]) = {
        //考虑使用元组,元组实现了(k,v)形式k相当于索引
        inputs.map(data => (data, f(data)))
          .reduce((data1, data2) =>
            if (data1._2 < data2._2) data2 else data1
          )._1
      }
    

    案例六(反思偏函数和高阶函数之间的区别)

    要得到一个序列的对偶很容易,比如:
    val pairs = (1 to 10) zip (11 to 20)
    假定你想要对这个序列做某种操作,比如,给对偶中的值求和,但是你不能直接使用:
    pairs.map( + )
    函数 _ + _ 接受两个Int作为参数,而不是(Int, Int)对偶。编写函数adjustToPair,该函数接受一个类型为(Int, Int) => Int的函数作为参数,并返回一个等效的, 可以以对偶作为参数的函数。举例来说就是:adjustToPair(_ * _)((6, 7))应得到42。然后用这个函数通过map计算出各个对偶的元素之和

      def main(args: Array[String]): Unit = {
        println(function7(_ * _)(6, 7))
        println(function7(_ + _)(6, 7))
        //考虑
        val pairs = (1 to 10) zip (11 to 20)
        println(pairs.map(function7(_ * _)))
        
      }
    
      def function7(f: (Int, Int) => Int) = {
        //反思这两种写法的区别
        (x: (Int, Int)) => f(x._1, x._2)
        // (data: Int, data1: Int) => f(data, data1)
      }
    

    案例七(控制抽象简单练习,考虑要柯里化)

    实现 if unless的功能

      //抽象控制模拟if 和 unless
      def main(args: Array[String]): Unit = {
            //实现if
            var a =10
            fun(a>0){
                a-=1
                println(a)
            }
    
        // unless
        fun1(0 < 1){
            println(10)
        }
    
    
      }
      //注意把any 类型 转换 为 unit
      def fun (f: => Boolean)(f1: =>Unit):Unit={
            if (f){
                f1
              fun(f)(f1)
            }
      }
      def fun1 (f: => Boolean)(f1: =>Unit):Unit={
        if (f){
          f1
        }
      }
    

    案例八(柯里化 解耦,一个简单的练习)

    两个字符串,先转大写 然后比较大小,考虑步骤分离
    发现一个问题,big函数有两种写法,有什么区别

    object Test2 {
      def main(args: Array[String]): Unit = {
        //
        println("hh".big("Hh", eq))
        println("hh".big("Hh", _.equals(_)))
        println("hh".big1("Hh")(eq))
        println("hh".big1("Hh")(_.equals(_)))
    
    
      }
       def eq(string1: String,string2: String)={
               string1.equals(string2)
       }
    
    
      implicit class fun(s1: String) {
        def big(s2: String, f: (String, String) => Boolean) = {
             f(s1.toUpperCase,s2.toUpperCase)
        }
      }
      implicit class fun2(s1: String) {
        def big1(s2: String)( f: (String, String) => Boolean) = {
          f(s1.toUpperCase,s2.toUpperCase)
        }
      }
    }
    

    案例九Word(Count案例,理解foldleft第一个参数的意义)

    统计字符串字母出现的次数.

    object Test3 {
      def main(args: Array[String]): Unit = {
        var st = "AAAABBBBCCCCWWWJJJTTDDDDEEE"
        //用可变map和不可变map分别实现
        // Map[Char, Int]()  ..这里要加()...这里map是不会初始化的最左边总有一个map
        val value = st.foldLeft(Map[Char, Int]())(MyfoldLeft)
        println(value)
        //HashMap(E -> 3, T -> 2, J -> 3, A -> 4, B -> 4, C -> 4, W -> 3, D -> 4)
        var map =  mutable.Map[Char, Int]()
        val value1 = st.foldLeft(map)(MyfoldLeft1)
        //HashMap(A -> 4, B -> 4, C -> 4, D -> 4, T -> 2, E -> 3, W -> 3, J -> 3)
        println(value1)
      }
      def MyfoldLeft(map: Map[Char, Int], char: Char) = {
        //如果没有这个字母就+1 考虑使用getorelse
        map + (char -> (map.getOrElse(char, 0) + 1))
      }
      def MyfoldLeft1(map: mutable.Map[Char, Int], char: Char) = {
        //如果没有这个字母就+1 考虑使用getorelse
        map + (char -> (map.getOrElse(char, 0) + 1))
      }
    }
    

    相关文章

      网友评论

          本文标题:2020-11.05-Scala-25(高阶函数练习题)

          本文链接:https://www.haomeiwen.com/subject/aqdkvktx.html