2014-02-26 40 views
1

我想用遞歸函數來實現一些東西,其中包括打印輸出。我想在打印的輸出中增加標籤的級別。我能夠成功實現這一目標使用以下方法Java遞歸函數,單值初始化

int count =0; 
public void m1 (Object n) 
{ 
    count++; 
    List nl = n.getChildren(); 
    int nlsize = nl.size(); 
    for (int i = 0 ; i < nlsize ; i++) 
    { 
     String objName = nl.getObjAt(i).getText(); 
     for (int tab=0; tab<count ; tab++) {System.out.print("\t");} 
     System.out.println(objName); 
     m1(nl.getObjAt(i)); 
    } 
    count--; 
} 

但限制而這種做法的問題,與數外的初始化的東西,是很明顯的。

有沒有辦法實現這個?我知道java不接受參數傳遞的默認值,否則這可能是一個可能的解決方案。如何才能實現這一目標?

+0

打印輸出每次遞歸函數被調用? – ItachiUchiha

+0

你應該將'count'作爲方法參數傳遞,最初傳遞爲0. – Manish

+0

是的,這是可能的解決方案,但有沒有一種方法不需要每次都將它傳遞爲0? – Shisa

回答

7

我會將它分成兩種方法:一種是隻有「自然」參數的公開方法,另一種是帶有兩個參數的私人方法(在這種情況下爲ncount),傳入初始值。你不需要在方法中修改count - 只是通過count + 1在遞歸調用:

public void m1(Object n) { 
    m1(n, 0); 
} 

private void m1(Object n, int count) { 
    List nl = n.getChildren(); 
    int nlsize = nl.size(); 
    for (int i = 0; i < nlsize; i++) { 
     String objName = nl.getObjAt(i).getText(); 
     for (int tab = 0; tab < count; tab++) { 
      System.out.print("\t"); 
     } 
     System.out.println(objName); 
     m1(nl.getObjAt(i), count + 1); 
    } 
} 

請注意,此開始了與在最外層沒有標籤,而你原來的代碼中使用一個標籤。如果需要,您可以通過1而不是0

(我也重新命名只是一切有名字是非常重要的! - 花一些時間挑選好的)

+0

啊,當然!而且,這些不是代碼中使用的實際名稱。 :) – Shisa