2.1
写一个递归函数,来获取第n个斐波那契数,前两个斐波那契数0和1,第n个数总是等于它前两个数的和一序列开始为 0、1、1、2、3、5。应该定义为局部( local )尾递归函数。
package com.lxuex.test.scala
object scala_01 {
def fib(n: Int): Int ={
@annotation.tailrec //尾调用优化
def local(n:Int,current: Int = 0,next: Int = 1): Int ={
if(n == 0 || n == 1){
next
} else {
local(n-1,next,current+next)
}
}
local(7)
}
def main(args: Array[String]):Unit = {
println(fib(3))
}
}
2.2
实现isSorted方法,检测Array[A]是否按照给定的比较函数排序:
package com.lxuex.test.scala
object test02 {
def main(args: Array[String]): Unit = {
val arr = Array(1,2,3,4,6,7)
println(isSorted(arr, (x: Int,y: Int)=>{x>y}))
}
def isSorted[A](as: Array[A], ordered: (A,A)=>Boolean):Boolean = {
@annotation.tailrec
def loop(n: Int): Boolean = {
if (n >= as.length-1) true
else if (ordered(as(n),as(n+1))) false
else loop(n + 1)
}
loop(0)
}
}
2.3
我们看另一个柯里化10 ( currying)的例子,把带有两个参数的函数f转换为只有一个参数的部分应用函数f。这里只有实现可编译通过。
def curry[A,B,C](f: (A, B) => C): A => (B => C)
def curry[A, B, C](f: (A, B) => C): A => (B => C) = (a:A)=>((b:B) => f(a, b))
2.4
实现反柯里化( uncurry ),与柯里化正相反。注意,因为右箭头=>是右结合的,A => (B=>C)可以写为A=>B=>C。
def uncurry[A,B,C](f: A => B => C): (A, B) => C
def uncurry[A,B,C](f: A => B => C): (A, B) => C = (a:A,b:B)=>f(a)(b)
2.5
实现一个高阶函数,可以组合两个函数为一个函数。
def compose[A,B,C] (f: B => C, g: A => B):A=> C
def compose[A,B,C](f: B => C, g: A => B): A => C = (a: A)=>f(g(a))