scala-递归

1.递归

递归简介

[!IMPORTANT]

1
2
3
4
5
// 递归操作-是指方法自己调用自己的情况
// 递归必须有出口,否则容易造成死递归
// 递归必须要有规律
// 构造方法不能递归
// 递归方法必有返回值的数据类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 定义一个show()方法,用来掩饰递归
// 定义变量,记录show()方法的调用次数
var count = 1
def show(): Int = {
// 递归指的就是方法自己调用自己
// 1.2打印show()方法的调用次数
println(s"${count}调用show()")
// 1.3修改count变量的值
count = count + 1
show()
1
}

// 调用show()方法
show()

2.递归案例-阶乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 2.递归案例:阶乘
// 1.定义方法factorial(),用来获取指定数字的阶乘
def factorial(n: Int):Int = {
// 出口
if (n == 1) 1
// 规律
else n * factorial(n - 1)
}

// 2.递归案例:阶乘
// 2.调用factorial()方法,获取指定数字的阶乘
val result = factorial(5)
// 3. 打印结果
println(result)

3.案列:斐波那契-不死神兔

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 案例二:斐波那契数列
// 已知数列1, 1, 2, 3, 5, 8, 13... 问第十二个是多少
// 出口:第一个月和第二个月的兔子对数都是 1
// 规律从第三个月开始,每月的兔子对数 = 它前两个月的兔子对数之和.
// 1.定义方法rabbit(), 用来获取兔子的对数
def rabbit(month: Int): Int= {
// 出口
if (month == 1 || month == 2) 1
// 规律
else rabbit(month - 1) + rabbit(month - 2)
}

// 案例二:斐波那契数列
// 2.调用方法,获取第12个月的兔子对数
val result1 = rabbit(12)
// 3. 打印
println(result1)

4.案例:打印目录文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 案例三:打印目录文件
// 1.定义printFile(dir: File), 用来打印该目录下所有的文件路径
def printFile(dir: File): Unit = {
// 1.1 判断用户传入的路径是否是文件夹路径,如果不是,直接提示
if (!dir.isDirectory) {
println("您录入的路径不合法,不是文件夹的路径.")
} else {
// 1.2 如果用户录入的是文件夹路径,程序继续执行
// listFile就是dir目录下的每一个文件或者是文件夹对象
// 1.3 通过File#listFile()获取到该目录下所有的文件或者文件夹的file对象形式
val listFiles = dir.listFiles()
// 1.4 遍历,获取到上一部(1.3) 获取到的每一个File对象
for (listFile <- listFiles) {
// listFile:表示dir目录下每一个具体的文件或者是文件夹对象
// 1.5 判断,如果是文件,就直接输出 就是出口
if (listFile.isFile) println(listFile)
// 1.6 如果是文件夹路径,就递归 就是规律
else printFile(listFile)
}
}
}

// 案例三:打印目录文件
// 2.调用printFile()方法
println(printFile(new File("J:\\大数据第一代项目")))