(一)递归函数的定义和格式
递归是一种常用的解决问题的方法,特别适用于解决可以被分解为类似子问题的问题。递归函数通常由两个主要部分组成:起始条件(或基线条件)和递归规则(或递归关系)。
起始条件:一个递归的终止条件,确保递归不会无限进行。它处理最简单的情况并返回结果.
递归规则:在这个部分,函数会调用自身,以解决一个更小的子问题。 递归函数:自己调用自己的函数
例:
object Base41 {
//递归函数:自己调用自己的函数
def f():Unit = {
println("f...被调用了")
f() //调用函数
}
def main(args: Array[String]): Unit ={
f()
println("over")
}
}
(二):计算累加
求1到100的和
object Base42 {
/**
* 通项公式: (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)
}
}
(三)计算阶乘
object Base43 {
//阶乘: 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(4) //1*2*3*4
println(rst)
}
}
(四)斐波那契数列
起始条件:f(0) = 0 , f(1) = 1
递归规则:f(n) = f(n-1) + f(n-2)(当 n ≥ 2)。求它的第n项。
例:
object Base44 {
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)
}
}
(五)打印数字的各个位数
object Base45 {
//把输入的整数的个位数上的数值输出来!
def f(n:Int):Unit = {
if(n < 9){
println(n)
}else{
f(n / 10)
println(n % 10)
}
}
def main(args: Array[String]): Unit = {
f(12345)
}
}
扩展:
object Base46 {
// 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')
}
}