递归函数

23 阅读2分钟

1.递归函数

递归:在函数内部 自己调用自己

特点:

1.可能会导致死循环:一直调用自己

def f():Unit = {   //定义一个f函数
   println("f函数被调用了......")

   f()
 }

  def main(args:Array[String]): Unit = {   //调用f函数
   f()
    while (true){
      println("f函数被调用了......")
    }
    println("main")
  }
}

2.递归函数的应用场景

特点及例题:

1.大问题可以拆解为同样性质的小问题

2.问题拆解到足够小的时候,可以直接求解

举例: 大任务:求1+2+3+.......+99+100的和(5050)

记f(n) = 1+2+3+.......+n

f(100) = 1+2+3+.......+99+100

f(99) = 1+2+3+.......+99

f(98) = 1+2+3+.......+98

则:f(100) = f(99)+100

f(99) = f(98)+99

......

....

f (1) = 1 (足够小的时候,可以直接求解)

eg1:

def f(n:Int):Int={
  if(n ==1){
    1
  }else{
    f(n-1) + n
  }
}




def main(args:Array[String]): Unit = {     //调用f函数
  val rst = f(100)   //5050
  println(rst)

eg2:

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

例子:

有五个台阶,一次性只能上一个或者两个台阶

则:

f(n)=f(n-1)+(n-2)

f(1)=1

f(2)=2

f(5)=8[斐波那契数列]

eg3:

 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(5)      //8
    println(rst)
  }
}

eg4:

求a的n次方:a * a * a......*a(n个)

f(a,0) = 1(表示a的0次方为1)

f(a,n) = a * f(a,n-1)(表示为a乘以a的n—1次方)

/*
求a的n次方: a * a * a......*a(n个)

f(a,0) = 1

f(a,n) = a * f(a,n-1)

*/
def f(a:Int,n:Int):Int={
  if( n == 0){
    1
  }else {
    a*f(a,n-1)   //n-1为括号内a的次方数表示为a的n—1次方
  }

}

eg5:

汉塔诺小游戏,递归函数

var i = 1;
def hanoi(n:Int, A: String, B: String, C: String): Unit = {
  if (n ==1){
    println(s"$i, move 1 from $A → $C")
    i +=1
  }else{
    hanoi(n-1, A, B, C)
    println(s"$i, move $n from $A → $C")
    i += 1
    hanoi(n-1, B, A, C)
  }
}