递归函数

64 阅读2分钟

递归函数:自己调用自己的函数(结果陷入死循环)

eg:


object Base44 {
  def f():Unit ={
    println("f....被调用了")
    f()
  }
  def main(args:Array[String]):Unit = {
    f()

    println("over")
  }
}
  • 1.适合用来解决一类问题:①.可以被分解为类似子问题;②.当问题被分解到足够小的时候,问题可以直接被求解.
  • 2.递归函数的组成部分:起始条件(或基线条件)和递归规则(或递归关系)。
  • eg:计算累加
object Base45 {
  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)
  }
}

eg:整数的阶乘

起始条件:0! = 1

递归规则:n! = n * (n-1)!

object Base46 {
  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)
  }

}

斐波那契数列的定义是:

起始条件:f(0) = 0 , f(1) = 1

递归规则:f(n) = f(n-1) + f(n-2)(当 n ≥ 2)。求它的第n项。

  • eg:假如一个青蛙要回家,一次可以跳一个台阶,也可以一次跳两个台阶,他家总共10个台阶,求回家的方式
object Base46 {
  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)
  }
}

eg:打印数字的各个位数

起始条件:f(n) = 输出个位 ,  n<9

递归规则:f(n) = f(n/10)+ 输出个位(当 n ≥ 10)

object Base47 {
  // 显式声明返回类型为Unit,因为函数主要用于打印
  def f(n: Int): Unit = {
    if (n < 9) {
      print(n)
    } else {
      // 先递归处理高位
      f(n / 10)
      // 再打印当前位
      print(n % 10)
    }
  }

  def main(args: Array[String]): Unit = {
    // 测试:打印12的各位,输出应为"12"
    f(12)
    println()  // 换行,使输出更清晰

    // 可以添加更多测试
    f(12345)   // 输出"12345"
    println()
  }
}

eg:汉诺塔游戏

f(n,A,B,C)=f(盒子的数量,起点,要借用的柱子,终点)

目标:在A上有n个盒子,我们要借用B,把他们按大小排列的放在C

object Base48 {
  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')
  }
}