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)
}
}