欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

递归---Day29

程序员文章站 2022-06-11 16:50:20
递归的概述 递归:指在当前方法内自己调用自己的方式叫做递归 递归的分类: 1.直接递归称为方法自身调用自己。 2.间接递归可以用A方法调用B方法,用B方法调用C方法,用C方法调用A方法。 递归的注意事项 递归一定要有限定条件,保证递归能够停止下来,否则会出现死循环,导致发生栈内存溢出。 在递归中虽然 ......

递归的概述

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

递归的分类:

  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 }