递归函数的基本应用

31 阅读1分钟

当我们遇到某一个数字的n次方时,随着n的变大,我们的计算就越容易失误,所以我们数学就出现了指数函数让人们知道随着n的变大,这歌值会越来越不好计算,当然,还有递归函数。

1.当我要计算a的n次方时,可以输入以下代码:

object base41 {
  // 案例二:计算a的n次方(递归实现)
  def power(a: Int, n: Int): Int = {
    // 终止条件:任何数的0次方都为1
    if (n == 0) {
      1
    } else {
      // 递归关系:a的n次方 = a * a的(n-1)次方
      a * power(a, n - 1)
    }
  }

  def main(args: Array[String]): Unit = {
    // 测试案例:计算2的3次方
    val result = power(2, 3)
    println(s"23次方结果为:$result") // 输出:2的3次方结果为:8

    // 额外测试:验证其他情况
    println(s"50次方结果为:${power(5, 0)}") // 输出:5的0次方结果为:1
    println(s"34次方结果为:${power(3, 4)}") // 输出:3的4次方结果为:81
  }
}

运行结果如图所示:

image.png

2.汉诺塔游戏

有一种益智游戏叫做汉诺塔,它的游戏场景是给你A,B,C三根柱子,然后在A柱子给你放一些圈圈,由大到小,从下到上,游戏规则是:将A处的圈圈按照从小到大的方式放到C柱子就算胜利,其中大号的圈圈不可在小号圈圈的上面。 它的游戏和递归函数有一种异曲同工之处,你可以输入以下代码:

object base43 {
  /*
   * 汉诺塔游戏
   */
  // A:起点,C表示终点,B表示可以借用的柱子
  def f(n: Int, A: String, C: String, B: String): Unit = {
    if (n == 1) {
      println(s"$A -> $C")
    } else {
      f(n - 1, A, B, C)
      println(s"$A -> $C")
      // 白色方框处,将 n - 1 个盘子从 B 移动到 C,借助 A
      f(n - 1, B, C, A)
    }
  }

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

运行结果如图所示:

image.png 这只是三层,可以修改4层,5层,6,7,8,9等层数。