递归

递归

递归指的是方法自己调用自己。

需要注意两个问题
1.方法调用一定要有出口
2.调用的次数不能过多

递归求和

 1 /*
 2    需求:求1~5之间的和
 3    假设:f(n)表示求n以内的和
 4         f(1) = 1
 5         f(2) = f(1) + 2
 6         f(3) = f(2) + 3
 7         f(4) = f(3) + 4
 8         f(5) = f(4) + 5
 9         ...
10         f(n) = f(n-1)+n
11  */
12 public class DiguiDemo1 {
13     public static void main(String[] args) {
14         int sum = getSum(5);
15         System.out.println(sum);
16     }
17 
18     //求n以内的和
19     public static int getSum(int n) {
20         if (n == 1) {
21             return 1;
22         } else {
23             return getSum(n - 1) + n;
24         }
25     }
26 }

 

递归求斐波那契数列

 1 /*
 2    需求:求斐波那契数列中的第n个数是多少?
 3         1   1   2   3   5   8   13  21  34  55....
 4    规律:
 5         第一个数和第二个数都是1
 6         从第三个数开始,每一个数字是前面两个数字之和
 7 
 8    假设:f(n)表示数列中的第n个数的值
 9         f(1) = 1
10         f(2) = 1
11         f(3) = f(1)+f(2)
12         f(4) = f(2)+f(3)
13         ...
14         f(n) = f(n-2)+f(n-1)
15  */
16 public class DiguiDemo2 {
17     public static void main(String[] args) {
18 
19         int num = getNum(10);
20         System.out.println(num);
21     }
22 
23     //求斐波那契数列的第n个数
24     public static int getNum(int n) {
25         if(n==1 || n==2){
26             return 1;
27         }else{
28             return getNum(n-2) + getNum(n-1);
29         }
30     }
31 }

 

求阶乘

 1 求1~10的阶乘,使用递归来做。
 2     10!=10*9*8*7*6*5*4*3*2*1
 3     /*
 4     假设f(n)就表示求1~n之间乘积
 5     f(1)=1;
 6     f(2)=f(1)*2;
 7     f(3)=f(2)*3;
 8     f(4)=f(3)*4;
 9     f(5)=f(4)*5;
10     ...
11     f(n)=f(n-1)+n;
12     */
13     //getSum方法就表示求1~n的和
14     public static int getSum(int n){
15         if(n==1){
16             return 1;
17         }else{
18             return getSum(n-1)*n;
19         }
20     }

 

文件夹的遍历

 1 遍历指定目录下所有的.java文件(包括子目录的)       
 2     //遍历输出指定目录下所有的.java文件
 3     public static void printJavaFile(File dir){
 4         if(dir.isDirctory()){
 5             //获取dir目录下所有的子文件和子目录
 6             File[] files=dir.listFiles();
 7             for(File file:files){
 8                 //如果file是文件
 9                 if(file.isFile()){
10                     //如果文件名是.java文件,就输出
11                     if(file.getName().endsWith(".java")){
12                         System.out.println(file);
13                     }
14                 }
15                 //如果file是目录
16                 if(file.isDirectory()){
17                     //递归调用,继续获取file目录下所有的子文件和子目录
18                     printJavaFile(file);
19                 }
20             }
21         }
22     }
23     
24 练习5:遍历指定目录下所有的.java文件(包括子目录的)   
25     要求:使用文件过滤器来做
26        //遍历指定目录下所有的.java文件(包括子目录的)
27 28     public static void  getJavaFile(File dir){
29         //判断dir是否为目录
30         if(dir.isDirectory()){
31             //过滤获取当前目录下所有的.java文件和子目录(文件过滤器)
32             File[] files = dir.listFiles(pathname -> {
33                 if (pathname.getName().endsWith(".java") || pathname.isDirectory()) {
34                     return true;
35                 }
36                 return false;
37             });
38 39             //遍历files数组
40             for (File file : files) {
41                 //如果是文件,直接输出(因为上面已经过滤了)
42                 if(file.isFile()){
43                     System.out.println(file);
44 45                 }
46                 //如果是文件夹继续递归
47                 else if(file.isDirectory()){
48                     getJavaFile(file);
49                 }
50             }
51         }
52     }
53 ​​​​​​​​​​​​​

 

posted @ 2021-05-19 21:32  依然耀眼  阅读(46)  评论(0)    收藏  举报