scala递归函数(1)

39 阅读2分钟

(一)递归函数的定义和格式

递归是一种常用的解决问题的方法,特别适用于解决可以被分解为类似子问题的问题。递归函数通常由两个主要部分组成:起始条件(或基线条件)和递归规则(或递归关系)。

起始条件:一个递归的终止条件,确保递归不会无限进行。它处理最简单的情况并返回结果.

递归规则:在这个部分,函数会调用自身,以解决一个更小的子问题。 递归函数:自己调用自己的函数

例:

object Base41 {
  //递归函数:自己调用自己的函数

  def f():Unit = {
    println("f...被调用了")

    f() //调用函数
  }
  def main(args: Array[String]): Unit ={
    f()

    println("over")
  }
}

(二):计算累加

求1到100的和

object Base42 {
  /**
   * 通项公式: (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)
  }
}

(三)计算阶乘

object Base43 {
  //阶乘: n! = 1 * 2 * 3 * ... * n
  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
    println(rst)

  }
}

(四)斐波那契数列

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

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

例:

object Base44 {
  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 Base45 {
  //把输入的整数的个位数上的数值输出来!
  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 Base46 {
//   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')
  }
}