《Scala函数式编程》第二章练习题

本文通过具体实例介绍了Scala语言中递归函数的应用,展示了如何检测数组排序状态,并探讨了柯里化和反柯里化的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值