2013-02-08 72 views
1

我在搜索一些答案時遇到了下面的代碼。在遞歸中繼續關鍵字

public static void recurse(Scanner in, HashMap<String, Integer> oldMap) { 
    HashMap<String, Integer> map = null; 
    if (oldMap == null) 
     map = new HashMap<String, Integer>(); 
    else 
     map = new HashMap<String, Integer>(oldMap); 
    while (in.hasNext) { 
     String s = in.nextLine(); 
     if (s.startsWith("[")) { 
      recurse(in, map); 
      continue; 
     } 
     if (s.startsWith("]")) { 
      break; 
     } 
     String[] split = s.split(" "); 
     if (s.startsWith("print")) { 
      System.out.println(map.containsKey(split[1]) ? map.get(split[1]) : 0); 
      continue; 
     } 
     int x = 0; 
     try { 
      x = Integer.parse(split[1]); 
     } catch (Exception e) { 
      x = map.containsKey(split[1]) ? map.get(split[1]) : 0; 
     } 
     map.put(split[0], x); 
    } 
} 

有人請解釋我,爲什麼這個人使用後繼續遞歸調用。這似乎是因爲每次處理遞歸調用都不會處理繼續。

+0

嗨路易斯,我同意,但爲什麼在if語句中已經提到繼續。我的意思是,如果我刪除繼續,那麼它會按原樣運行。 – manishpro 2013-02-08 18:07:30

回答

4

的確,遞歸調用將被處理—,但最終會返回遞歸調用。 (除非它引發異常或進入無限循環,就是這樣。)在遞歸調用返回後,將執行continue語句。

它可以幫助你用遞歸的簡單的例子來打:

public void printOneToN(int n) { 
    if(n > 1) { 
     printOneToN(n - 1); 
    } 
    System.out.println(n); 
} 

正如你可以看到運行(說)printOneToN(10),每次遞歸調用後,控制返回到它的調用者。遞歸調用不會取代其調用者。

+0

當你說recusrive調用將返回,你的意思是一旦遞歸循環自行結束,那麼它將返回到原來的位置,如果從它被調用的語句。在那種情況下,我還有一個疑問,在返回if條件之前必須得到滿足。不過,我很困惑...... – manishpro 2013-02-08 18:10:26

+0

@manishpro:它不會「返回到原來的if語句」,它完成執行行它在哪裏被調用,這已經在if中。 – 2013-02-08 18:14:27

+0

謝謝Ruakh和Nathan,現在我明白了...... – manishpro 2013-02-08 18:16:32

1

continue與遞歸調用無關;其效果是跳過while循環的其餘內容並直接回到in.hasNext()