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) }