zoukankan      html  css  js  c++  java
  • 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)
      }
  • 相关阅读:
    TSQL Beginners Challenge 1
    SQL拾遗
    简易实体生成方式
    CTE-递归[2]
    编号处理
    行列转换/横转竖
    OUTPUT、Merge语句的使用
    关于SQL IO的一些资料
    对左值(lvalue)和右值(rvalue)的两种理解方式
    跨平台判断64位和32位开发的一些宏定义
  • 原文地址:https://www.cnblogs.com/sabertobih/p/13664045.html
Copyright © 2011-2022 走看看