递归---Day29

递归的概述

  递归:指在当前方法内自己调用自己的方式叫做递归

递归的分类:

  1.直接递归称为方法自身调用自己。

  2.间接递归可以用A方法调用B方法,用B方法调用C方法,用C方法调用A方法。 

递归的注意事项

  递归一定要有限定条件,保证递归能够停止下来,否则会出现死循环,导致发生栈内存溢出。 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。   构造方法,禁止递归

 1 package demosummary.recursive;
 2 
 3 public class RecursiveDemo1 {
 4     public static void main(String[] args) {
 5         //调用a方法
 6         a(1);
 7         //调用b方法
 8         b();
 9     }
10 
11     private static void a(int i) {
12         System.out.println(i);
13         //添加一个条件避免发生内存溢出现象
14         if (i == 10) {
15             return;
16         }
17         a(++i);
18     }
19 
20     //没有限制条件,会发生内存溢出现象
21     private static void b() {
22         System.out.println("b方法");
23         b();
24     }
25 }

递归累加求和

 1 package demosummary.recursive;
 2 
 3 /**
 4  * 计算1~n的和
 5  * 分析:
 6  *    num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用
 7  */
 8 public class RecursiveSum {
 9     public static void main(String[] args) {
10         int sum = getSum(5);
11         System.out.println(sum);
12     }
13 
14     private static int getSum(int num) {
15         if (num == 1) {
16             return 1;
17         }
18         return num+getSum(num -1);
19     }
20 }

递归求阶乘(同求和一样解法)

 1 package demosummary.recursive;
 2 
 3 public class RecursiveFactorial {
 4     public static void main(String[] args) {
 5         int sum = getSum(5);
 6         System.out.println(sum);
 7     }
 8 
 9     private static int getSum(int num) {
10         //当num=1时,停止递归,防止发生内存溢出现象
11         if (num == 1) {
12             return 1;
13         }
14         return num * getSum(num - 1);
15     }
16 }

递归打印多级目录

 1 package demosummary.recursive;
 2 
 3 import java.io.File;
 4 
 5 public class RecursivePrintDir {
 6     public static void main(String[] args) {
 7         //创建File对象
 8         File file = new File(".//filter");
 9         //调用打印方法
10         printDir(file);
11     }
12 
13     private static void printDir(File dir) {
14         //获取目录的集合
15         File[] files = dir.listFiles();
16         //循环打印目录
17         for (File file : files) {
18             if (file.isFile()) {//判断是否为文件
19                 System.out.println("文件的路径:" + file.getAbsolutePath());
20             } else {//判断是否为目录
21                 System.out.println("目录的路径:" + file.getAbsolutePath());
22                 //是目录则继续往下打印
23                 printDir(file);
24             }
25         }
26     }
27 }

 

posted @ 2019-12-05 00:46  CeliaTodd  阅读(259)  评论(0编辑  收藏  举报