递归函数

62 阅读1分钟

1·递归函数定义:自己调用自己的函数

object w01 {
  def f():Unit={
    println("f.........")
    f()
  }

  def main(args: Array[String]): Unit = {
    f()
    println("over")
  }

}

2·用途:适合用来解决两类问题:1. 可以分解为类似子问题的问题。2. 当分解到足够小的时候,可以直接求解。

案例1:计算累加

object w03 {
  def f(n:Int):Int={
    if(n==1) {
      1
    } else {
      f(n-1)+n
    }
  }

  def main(args: Array[String]): Unit = {
    val rst=f(100)
    println(rst)
  }

}

案例2·计算阶乘

object w04 {
  def f(n:Int):Int={
    if(n==1) {
      1
    } else {
      f(n-1)*n
    }
  }

  def main(args: Array[String]): Unit = {
    val rst=f(4)
    println(rst)
  }

}

斐波那契数列

案例

object w04 {
  def f(n:Int):Int={
    if(n==1) {
      1
    } else if(n==2) {
     2
    }else{
      f(n-1)+f(n-2)
    }
  }

  def main(args: Array[String]): Unit = {
    val rst=f(10)
    println(rst)
  }

}

把输出的数字各个位置上的数字打印出来

object w05 {
  def f(n: Int): Unit = {
    if (n < 9) {
      println(n)
    } else {
      println(n % 10)
      f(n / 10)
    }
  }

  def main(args: Array[String]): Unit = {
    f(12345)
  }


}

n个盘子从‌起始柱A移动到‌目标柱C,需借助‌辅助柱B,核心步骤分为三步:

第一步:把n-1个盘子从A借助C移动到B(递归处理子问题);

第二步:把A上剩余的1个盘子直接移动到C;

第三步:把B上的n-1个盘子借助A移动到C(再次递归处理子问题)

object w06 {
  def f(n:Int,A:Char,B:Char,C:Char):Unit={
    if(n==1){
      println(s"${A}--->${C}")
    }else{
      f(n-1,A,C,B)
      println(s"${A}--->${C}")
      f(n-1,B,A,C)
    }
  }

  def main(args: Array[String]): Unit = {
    f(4,'A','B','C')
  }
}