龙空技术网

Java递归-recursion

棉花糖老丫 47

前言:

当前姐妹们对“java递归结束条件”可能比较注重,各位老铁们都需要分析一些“java递归结束条件”的相关知识。那么小编在网上收集了一些对于“java递归结束条件””的相关知识,希望小伙伴们能喜欢,大家快快来了解一下吧!

1. 递归

递归(recursion)做为一种算法在程序设计语言中广泛应用。是指函数/过程/子程序在运行过程中直接或间接调用自身而产生的重入现象。

(自己调用自己,有结束条件)

注意:递归时一定要明确结束条件。

数学中递归运算.

对于任何正整数N ,N! (读作N的阶乘)的值定义为1-N(包括N)的所有的整数的成绩.因此3! 就是 3!=3*2*1 =6;

5! 定义为5!=5*4*3*2*1=120

那么整数N 的阶乘 N! 可以表示为

1!=1

N!=N*(N-1)! for N>1

若果N 等于1 那么1的继承就是1,其他所有N! =N*(N-1)!,例如:50!=50*49!

49!=49*48! 48!=48*47! 一直持续到1出现.

如何使用Java程序计算阶乘?

public static long recursion(int n) {

if (n == 1) {

return 1;

} else {

return n * recursion(n - 1);

}

}

1.1. 案例

1,列出指定目录中所有的子孙文件与子孙目录名,只需要列出名称即可。

2,列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格:

第一级前面有0个,第二级前面有1个,第三级前面有2个...,以此类推。

3,列出指定目录中所有的子孙文件与子孙目录名,要求要是树状结构,效果如下所示:

|--src

| |--cn

| | |--ittest

| | | |--a_helloworld

| | | | |--HelloWorld.java

| | | |--b_for

| | | | |--ForTest.java

| | | |--c_api

| | | | |--Student.java

|--bin

| |--cn

| | |--ittest

| | | |--i_exception

| | | | |--ExceptionTest.class

| | | |--h_linecount

| | | | |--LineCounter3.class

| | | | |--LineCounter2.class

| | | | |--LineCounter.class

|--lib

| |--commons-io.jar

答案:

案例一:

// 1,列出指定目录中所有的子孙文件与子孙目录名,只需要列出名称即可。

private static void listFile(File file) {

File[] listFiles = file.listFiles();

for (File f : listFiles) {

if (f.isFile()) {

System.out.println(f.getName());

} else if (f.isDirectory()) {

System.out.println(f.getName());

listFile(f);

}

}

}

public static void main(String[] args) {

File file = new File("c:\\abc");

listFile(file);

}

案例二

// 2,列出指定目录中所有的子孙文件与子孙目录名,要求名称前面要有相应数量的空格:

private static void listFile2(File file, String str) {

File[] listFiles = file.listFiles();

for (int i = 0; i < listFiles.length; i++) {

File f = listFiles[i];

System.out.println(str + f.getName());

if (f.isDirectory()) {

listFile2(f, str + "-");

}

}

}

public static void main(String[] args) {

File file = new File("c:\\abc");

String str = "-";

listFile2(file, str);

}

案例三:

// 列出指定目录中所有的子孙文件与子孙目录名,要求要是树状结构

private static void listFile3(File file, String str) {

File[] listFiles = file.listFiles();

for (File f : listFiles) {

System.out.println(str + f.getName());

if (f.isDirectory()) {

listFile3(f, "| " + str);

}

}

}

public static void main(String[] args) {

File file = new File("c:\\abc");

file = new File("c:\\day18ide");

file = new File("c:\\MyIo");

str = "|-";

listFile3(file, str);

}

1.2. 练习

1,删除一个非空的目录。

2,移动一个非空的目录到另一个地方(剪切)。

3,把File类中的重要方法设计代码测试一遍。

// 1,删除一个非空的目录。并加强健壮性

private static void deleteFile(File file) {

if (!file.exists()) {

System.out.println("路径不存在");

return;

}

if (!file.isDirectory()) {

System.out.println("不是目录");

return;

}

// 如果当前目录中有子目录和文件,先删除子目录和文件

File[] listFiles = file.listFiles();

for (File f : listFiles) {

if (f.isFile()) {

f.delete();

} else if (f.isDirectory()) {

deleteFile(f);

}

}

// 删除当前目录

file.delete();

}

练习2:

使用File类的renameTo 方法和递归实现非空目录的剪切.

public static void main(String[] args) throws IOException {

// 重命名文件(成功)

// File src = new File("c:\\aaa.txt");

// File dest = new File("c:\\bbb.txt");

// src.renameTo(dest);

// //移动文件(成功)

// File src = new File("c:\\aaa.txt");

// File dest = new File("d:\\aaa.txt");

// src.renameTo(dest);

// 移动一个空目录(失败)

// File src = new File("c:\\aaa");

// File dest = new File("d:\\aaa");

// System.out.println(src.renameTo(dest));

// 使用File类和递归实现文件的剪切.

File src = new File("c:\\abc");

File dest = new File("d:\\");

cutFile(src, dest);

}

// 移动一个非空的目录到另一个地方(剪切)。

private static void cutFile(File srcDir, File dest) throws IOException {

if (!srcDir.exists() || !dest.exists()) {

System.out.println("指定的源目录或者目标目录不存在");

return;

}

if (!srcDir.isDirectory() || !dest.isDirectory()) {

System.out.println("指定的源目录或者目标目录不是目录");

return;

}

// 得到源目录名

String srcDirName = srcDir.getName(); // abc

// 根据源目录名创建新目录名

File destDir = new File(dest + srcDirName); // d:\\abc dest 为父路径

// srcDirName 为子路径

// 创建目标目录

destDir.mkdir();

// 遍历源目录

File[] listFiles = srcDir.listFiles();

for (File f : listFiles) {

// 如果是子源文件,使用renameTo方法,移动至目标目录中(该方法同时会删除源目录中的文件)

if (f.isFile()) {

f.renameTo(new File(destDir, f.getName())); // 指定目标文件的父目录,文件名(根据源文件名生成).

} else if (f.isDirectory()) {

// 如果是子目录,执行重复动作. 将源子目录 , 目标目录(父目录+//)

cutFile(f, new File(destDir, File.separator)); // 指定源目录,指定目的路径d:\\abc\\

}

}

// 删除源目录

srcDir.delete();

}

标签: #java递归结束条件