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+"\t");
//        --num;
//        testRecursive(num);
         testRecursive(--num);
        System.out.println("我是第"+num);
    }

结果:

原因:

 

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

伪递归!

// 2.伪递归
public void testRecursive(int num){
        if(num<0){
            return;
        }
        System.out.println(num+"\t");
        --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)
  }

 

posted @ 2020-09-13 23:13  PEAR2020  阅读(222)  评论(0编辑  收藏  举报