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)
      }
  • 相关阅读:
    PBE加密 .net 实现
    手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}
    fish redux 个人理解
    .net Core 图片验证码 基于SkiaSharp实现
    .net core webapi jwt 更为清爽的认证 ,续期很简单(2)
    js删除数组对象中符合条件的数据
    编译.net .net Core程序 代码,仅做备份
    Mybatis架构相关的知识
    java选择题知识总结大全
    Mybatis详解(二) sqlsession的创建过程
  • 原文地址:https://www.cnblogs.com/sabertobih/p/13664045.html
Copyright © 2011-2022 走看看