6.遞歸調用
方法的遞歸調用就是方法自身調用自身。
以下程序因為遞歸沒有結束的條件,所以一直壓棧,沒有彈棧,導致棧內存溢出錯誤!所以遞歸必須要有結束條件。
public class RecursionTest01{ //入口 public static void main(String[] args){ m1(); } public static void m1(){ m1(); //java.lang.StackOverflowError } } |
【例題1】:不使用遞歸,計算1-N的求和。
public class RecursionTest02{ public static void main(String[] args){ int n = 5; //調用該方法完成1-N的求和 int retValue = method1(n); System.out.println(retValue); //15 } //該方法完成1-N的求和. public static int method1(int n){ int sum = 0; for(int i=0;i<=n;i++){ sum += i; } return sum; } } |
【例題2】:使用遞歸,計算1-N的求和。
public class RecursionTest03{ public static void main(String[] args){ int n = 5; //調用該方法完成1-N的求和 int retValue = method1(n); System.out.println(retValue); //15 }
//該方法完成1-N的求和. //1+2+3+4+5+...N public static int method1(int n){ if(n==1){ return 1; }else{ return n + method1(n-1); }}} |
【練習】:計算N的階乘。兩種方式:使用遞歸和不使用遞歸。
public class RecursionTest04{ public static void main(String[] rgs){ System.out.println(method1(5)); //120 } public static int method1(int n){ //不使用遞歸 int result = 1; for(int i=1;i<=n;i++){ result *= i; } return result; //使用遞歸 if(n==1){ return 1; }else{ return n * method1(n-1); } } } |