遞歸的概述 遞歸:指在當前方法內自己調用自己的方式叫做遞歸 遞歸的分類: 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 }