递归函数:自己调用自己的函数(结果陷入死循环)
eg:
object Base44 {
def f():Unit ={
println("f....被调用了")
f()
}
def main(args:Array[String]):Unit = {
f()
println("over")
}
}
- 1.适合用来解决一类问题:①.可以被分解为类似子问题;②.当问题被分解到足够小的时候,问题可以直接被求解.
- 2.递归函数的组成部分:起始条件(或基线条件)和递归规则(或递归关系)。
- eg:计算累加
object Base45 {
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)
}
}
eg:整数的阶乘
起始条件:0! = 1
递归规则:n! = n * (n-1)!
object Base46 {
def f(n:Int):Int={
if(n==1)
1
else
f(n-1)*n
}
def main(args:Array[String]):Unit = {
val rst=f(4)
println(rst)
}
}
斐波那契数列的定义是:
起始条件:f(0) = 0 , f(1) = 1
递归规则:f(n) = f(n-1) + f(n-2)(当 n ≥ 2)。求它的第n项。
- eg:假如一个青蛙要回家,一次可以跳一个台阶,也可以一次跳两个台阶,他家总共10个台阶,求回家的方式
object Base46 {
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)
}
}
eg:打印数字的各个位数
起始条件:f(n) = 输出个位 , n<9
递归规则:f(n) = f(n/10)+ 输出个位(当 n ≥ 10)
object Base47 {
// 显式声明返回类型为Unit,因为函数主要用于打印
def f(n: Int): Unit = {
if (n < 9) {
print(n)
} else {
// 先递归处理高位
f(n / 10)
// 再打印当前位
print(n % 10)
}
}
def main(args: Array[String]): Unit = {
// 测试:打印12的各位,输出应为"12"
f(12)
println() // 换行,使输出更清晰
// 可以添加更多测试
f(12345) // 输出"12345"
println()
}
}
eg:汉诺塔游戏
f(n,A,B,C)=f(盒子的数量,起点,要借用的柱子,终点)
目标:在A上有n个盒子,我们要借用B,把他们按大小排列的放在C
object Base48 {
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')
}
}