public class RecursionTest01{ public static void main(String[] args){ System.out.println("main begin"); // 调用doSome方法 doSome(); System.out.println("main over"); } public static void doSome(){ System.out.println("main begin"); doSome(); // 调用方法自身 System.out.println("main over"); } }
doSome
的代码片段只有一份public static void doSome(){ System.out.println("main begin"); doSome(); // 这块代码不结束,下一行代码不执行 System.out.println("main over"); }
doSome
方法就会在栈内存中新分配一块所属内存空间Error
】
什么是递归?
方法自身调用自身
a(){ a(); }
递归是很耗费栈内存的,递归算法能不用就尽量不用
递归必须有结束条件,不然必定会发生栈内存溢出错误
递归即使有结束条件,但也可能发生栈内存溢出错误,因为递归的太深了
public class RexursionTest{ public static void main(String[] args){ int num = 4; System.out.println("sum: " + sum(num)); System.out.println("rexursionSum: " + rexursionSum(num)); } // 求 1~N 的和 public static int sum(int num){ int result = 0; for(int i = 1; i <= num; i++){ result += i; } return result; } // 使用递归,求 1~N 的和 public static int rexursionSum(int num){ if (num == 1){ return 1; } return num + rexursionSum(num - 1); } }
结果:
sum: 10 rexursionSum: 10
感受递归:
public class RexursionTest{ public static void main(String[] args){ int num = 4; System.out.println("------------\nsum: " + sum(num)); } // 使用递归,求 1~N 的和 public static int sum(int num){ System.out.println("sum " + num + " 执行开始"); int result; System.out.println("num: " + num); if (num == 1){ System.out.println("sum " + num + " 执行结束"); return 1; } result = sum(num - 1); System.out.println("result: " + result); result += num; System.out.println("result += num: " + result); System.out.println("sum " + num + " 执行结束"); return result; } }
结果:
sum 4 执行开始 num: 4 sum 3 执行开始 num: 3 sum 2 执行开始 num: 2 sum 1 执行开始 num: 1 sum 1 执行结束 result: 1 result += num: 3 sum 2 执行结束 result: 3 result += num: 6 sum 3 执行结束 result: 6 result += num: 10 sum 4 执行结束 ------------ sum: 10