递归函数的定义
自己调用自己的函数
适用用来解决一类问题:
1.可以被分解为类似子问题
2.当分解到足够小的时候,问题可以直接求解
可能会产生死循环
def f():Unit = {
println("f.....被调用了")
f()
}
def main(args: Array[String]): Unit = {
f()
println("over")
}
}
结果:"f.....被调用了" 一直循环
任务
求 1+2+3+......+99+100 的和 (5050)
分解(1+2+3+4+....+98) + 99
任务分解到足够小:
1 -> 1
通项公式:(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)
}
}
游戏环节之斐波那契数列
总共n个楼梯,有一节一节上,也可以两节两节上,也可以一节接两节上
f(n) 是上n个台阶的方式
f(6) 是上6个台阶的方式
由此推出f(5) = f(4) + f(3)
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)
}
}
当有10个楼梯时会有89种上法
趣味小游戏
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')
}
}
当4个盘子时会有15步
A ---> B
A ---> C
B ---> C
A ---> B
C ---> A
C ---> B
A ---> B
A ---> C
B ---> C
B ---> A
C ---> A
B ---> C
A ---> B
A ---> C
B ---> C