object class6 {
def main(args: Array[String]): Unit = {object Base45 {
/**
* 递归函数:自己调用自己的函数
*/
// 定义函数
def f(): Unit = {
println("f.....被调用了")
f() // 调用函数
}
println("f.....被调用了")
}
def main(args: Array[String]): Unit = {
f()
println("over")
}
}
递归函数
-
递归是一种常用的解决问题的方法,特别适用于解决可以被分问题。递归函数通常由两个主要部分组成:起始条件(或基线条件、递归关系)。
-
起始条件:一个递归的终止条件,确保递归不会无限进行。它并返回结果。
-
递归规则:在这个部分,函数会调用自身,以解决一个更小的
object class21 {
/**
* 1. 可以被分解为类似子问题
* 2. 当分解到足够小的时候,问题可以直接求解
*
* 任务:求 1 + 2 + 3 .... + 99 + 100 的和(5050)
*
* 分解 (1+2+3+4+....+99) + 100
*
* (1+2+3+4+....+98) + 99
*
* 任务分解到足够小:
* 1 → 1
* 通项公式: (n) = 1 + 2 + 3 .... + n
*
* f(1) = 1
* f(n) = f(n-1) + 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(100)
println(rst)
}
}
object class6
{
/**
* 递归函数:自己调用自己的函数
* 适合用来解决一类问题
* 1. 可以被分解为类似子问题
* 2. 当分解到足够小的时候,问题可以直接求解
*/
// 斐波那契数列
def f(n: Int): Int = {
if (n == 1) {
1
} else if (n == 2) {
2
} else {
}
}
def main(args: Array[String]): Unit = {
val rst = f(10) // 89
println(rst)
}
}
object class6
{
// 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')
}
}