幫助大家理解一下遞歸函數的返回值...


如題:

遞歸函數往往可以簡化我們的代碼,尤其是對樹的遍歷和利用回溯算法寫代碼的時候,但是遞歸函數的返回值往往是困擾我們的。

總體來說,我們先要理解函數的調用過程,函數調用過程會用棧來保存函數的返回值和過程,而遞歸函數就是調用自身函數的過程,所以也是用棧存儲,這樣就比較容易理解了。

下面一段代碼可以幫助大家理解遞歸函數的返回值。

 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 }

下面是程序的輸出結果截圖.

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

下面是壓入棧過程的示意圖。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM