• scala 之 函数(一)


    一、高阶函数

    高阶函数主要有两种:一种是将一个函数当做另外一个函数的参数(即函数参数);
    另外一种是返回值是函数的函数。

    如下,sum中传的是【函数方法体f】,所以在sum高阶函数中需要处理f,f()表示执行函数

      // 1.传入函数 + 返回函数
      def sum(f: Int => Int): (Int, Int) => Int = {
        def sumF(a: Int, b: Int): Int = {
          if (a > b) 0
          else f(a) + sumF(a + 1, b)
        }
        sumF
      }
      // 2.传入函数,返回 Int
      def add(f:Int=>Int)(a:Int,b:Int):Int={
        if(a>b) 0 else f(a)+add(f)(a+1,b)
      }
    
      def main(args: Array[String]): Unit = {
        // f(1)+f(2)+f(3)+f(4) =2+4+6+8= 20
        println(sum(x =>x + x)(1,4))
        println(add(x => x)(1,4))
      }

    二、匿名函数

    箭头左边是参数列表,右边是函数体。常被用于高阶函数(匿名函数)

    赋值给f,所以也是类属性

    kkk(f(20,30))   &&    kkk(f)

    >>> 前者调用了方法执行体,所以kkk中不需要 f()

    >>> 后者没有方法体,kkk中需要 f() 

    val f = (d: Int, g: Int) => {
          println(d + 20)
          d + 20
        }

    三、中缀表达式,用于case中

    最后一个是List(1,2,3,4)盛放剩下的元素,如下如果写到five结束,five便匹配List()

    但此时是six,显然写多了,上面无匹配,选择到下面匹配 _=> "hehe"

    List(1, 2, 3, 4) match {
              // 中缀表达式
              case one :: two :: three :: four :: five :: six => println(one)
              case _ => println("hehe") 
            }

    四、中置操作符

      new MyClass(10) * (new MyClass(20))
    // 其中* 是定义在MyClass类中的方法,等同.*(...)

    五、递归和伪递归

    // 1.递归
    public void testRecursive(int num){
            if(num<0){
                return;
            }
            System.out.println(num+"	");
    //        --num;
    //        testRecursive(num);
             testRecursive(--num);
            System.out.println("我是第"+num);
        }

    结果:

    原因:

     那么如何解决这样内存开销的问题?

    伪递归!

    // 2.伪递归
    public void testRecursive(int num){
            if(num<0){
                return;
            }
            System.out.println(num+"	");
            --num; // 计算放在前面
            testRecursive(num); // 这句必须作为伪递归最后一句,且num不可有计算,有计算会默认你下面还没有执行结束
        //    System.out.println("我是第"+num); 递归后不可以有语句!
        }

    而在scala中,

    1)  没有--num   =>   用 num -= 1

    2) def 中传的参数是val,不可以在函数中改变!

     那么如何用伪递归实现scala中的斐波那契数列呢?

    1 1 2 3 5 8 13

      def fib(num:Int) = {
        var num1:Int = 1
        var num2:Int = 0
        var num3:Int = 0
        var n = num
        def  innerFib():Unit = {
          if (n > 0){
            num2 = num1 + num3;
            num3 = num1 + num2;
            print(num1+" "+num2+" "+num3+" ")
            num1 = num2+num3;
            n -= 1
            innerFib();
          }
        }
        innerFib()
      }
    
      def main(args: Array[String]): Unit = {
        fib(3)
      }
  • 相关阅读:
    今天开通我的博客
    在ArcGIS中,利用“行政单元面积权重法”实现人口数据格网化
    ArcGIS 下的水文分析
    常用计数器的verilog实现(binary、gray、onehot、LFSR、环形、扭环形)
    简单组合逻辑电路的verilog实现(包括三态门、38译码器、83优先编码器、8bit奇偶校验器)
    乘法器的verilog实现(并行、移位相加、查找表)
    简单时序逻辑电路的verilog实现,包括D触发器、JK触发器、锁存器、寄存器、
    简单ALU(算术逻辑单元)的verilog实现
    ubuntu下安装virtualbox 错误及解决办法
    C++单例模式对象的控制释放分析
  • 原文地址:https://www.cnblogs.com/sabertobih/p/13664045.html
Copyright © 2020-2023  润新知