如題:
遞歸函數往往可以簡化我們的代碼,尤其是對樹的遍歷和利用回溯算法寫代碼的時候,但是遞歸函數的返回值往往是困擾我們的。
總體來說,我們先要理解函數的調用過程,函數調用過程會用棧來保存函數的返回值和過程,而遞歸函數就是調用自身函數的過程,所以也是用棧存儲,這樣就比較容易理解了。
下面一段代碼可以幫助大家理解遞歸函數的返回值。
1 package test; 2 3 4 public class RecursionValueReturn { 5 6 /* 7 *目的: 8 * 遞歸返回值測試 9 */ 10 11 int recurse(int i) 12 { 13 if(i == 0) 14 { 15 return 0; 16 } 17 else 18 { 19 i--;//i--必須放在前面,由於函數的中間結果值用棧保存,不然i--無法執行,會使遞歸函數對系統的棧用光 20 recurse(i); 21 //i--; 22 } 23 24 System.out.print(" "+ i); 25 return i; 26 27 } 28 29 public static void main(String[] args) { 30 // TODO Auto-generated method stub 31 RecursionValueReturn result = new RecursionValueReturn(); 32 int value = result.recurse(10); 33 System.out.println(); 34 System.out.println("final return value " + value); 35 } 36 37 }
下面是程序的輸出結果截圖.

由輸出和函數的返回結果可以看出,遞歸函數是用棧存儲函數返回值和中間過程,每次返回棧頂的結果(包括中間的輸出值和返回值),而遞歸函數最終的返回值的是棧底的值,也就是遞歸函數第一次調用時的返回值.
下面是壓入棧過程的示意圖。

