递归函数

48 阅读1分钟

1.可以被分解为类似子问题

2.当分解到足够小的时候,问题

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)
  }
}
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) // 1*2*3*4 = 24
    println(rst)
  }

}

2到6行:修改代码完成阶乘的功能

用斐波那契数列求f(10)

object Base47 {
 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 Base48 {
def f(n:Int):Unit = {
  if(n<9){
    println(n)
  } else {
    f(n/10)
    println(n%10)
  }
}

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

汉诺塔游戏

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