13.函数中的递归函数

34 阅读2分钟

递归函数的定义

自己调用自己的函数
适用用来解决一类问题:
    1.可以被分解为类似子问题
    2.当分解到足够小的时候,问题可以直接求解
可能会产生死循环
  def f():Unit = {
    println("f.....被调用了")

    f()
  }

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

    println("over")
  }
}

结果:"f.....被调用了" 一直循环

任务
1+2+3+......+99+100 的和 (5050)
        
        分解(1+2+3+4+....+98) + 99
        
        任务分解到足够小:
        1 -> 1
        通项公式:(n) = 1+2+3..... +n
                   f(1)= 1
                   f(n)= f(n-1) + n
  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)
  }
}

游戏环节之斐波那契数列

    总共n个楼梯,有一节一节上,也可以两节两节上,也可以一节接两节上
    f(n) 是上n个台阶的方式
    f(6) 是上6个台阶的方式
    由此推出f(5) = f(4) + f(3)
  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)
  }
}
        当有10个楼梯时会有89种上法
趣味小游戏
       f(n, A, B, C)
       f(盘子的数量,起点,要借用的柱子,终点)
       目标:在A上有n个盘子,我们需要借助B,把他们都移动到C
       如果:n == 1.直接从 A 移动到 C
       否则:
           1.把n-1个盘子从A 移动到 B
           2.把一个盘子从A 移动到 C
           3.把n-1个盘子从B 移动到 C
 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')
  }
}
当4个盘子时会有15步
A ---> B
A ---> C
B ---> C
A ---> B
C ---> A
C ---> B
A ---> B
A ---> C
B ---> C
B ---> A
C ---> A
B ---> C
A ---> B
A ---> C
B ---> C