2012-07-05 66 views
-2

重複代碼,我想轉換下面給出的遞歸函數:問題在Java

LinkedList i=a; //a contains the nodes which are adjacent to the last element of g 
for(String i1: i) 
{ 
    if(g.contains(i1) || i1.equals("o")) 
    { continue; } 
    g.addLast(i1); 
    func(g); 
    g.removeLast(); 
} 

我想上面的程序轉換爲一個迭代。誰能幫

+3

對於初學者來說,我可以做一些代碼,'而(g.isEmpty())'絕不會出現在所有的,因爲你添加的東西'g^'就在那個循環之前。目前還不清楚這裏所有的變量是什麼意思,我很確定你會在這裏用幾行代碼來切換變量。 – 2012-07-05 18:29:44

+5

_program似乎不工作?你面臨的具體問題是什麼?錯誤?例外? – Asif 2012-07-05 18:31:10

+0

@GrailsGuy它顯然不是家庭作業 – user1355603 2012-07-05 18:34:43

回答

0
LinkedList i=a; //a contains the nodes which are adjacent to the last element of g 
    for(String i1: i) 
    { 
     if(g.contains(i1) || i1.equals("o")) 
     { continue; } 
     g.addLast(i1); 
     func(g); 
     g.removeLast(); 
    } 

所以通過這個看起來好像步驟走如下:
1)檢查當前String的存在,或者如果它等於「O」
2A)如果是繼續
2b)否則將當前字符串放在列表的末尾。
3)重複步驟1> 2
4)刪除列表

的最後一個元素,如果我讓代碼儘可能簡單給出的步驟它看起來像這樣:

func(LinkedList ll) 
{ 

    Set set = new HashSet(ll); //removes all duplicates 
    if(set.contains("o") { set.remove("o") ;} //these are strings so that works 
    LinkedList newLL = new LinkedList(set); //order still retained 
    newLL.poll(); //remove last element 
} 
0

如果我理解正確的代碼,它會找到所有可用的路徑,對不對?

主要的2個問題我在你的第二個代碼中看到的是:

  • 在遞歸版本,您可以通過調用FUNC處理與currentNode的路徑,然後取出currentNode。在迭代版本中,您將visitedNodes放入堆棧中「待處理」,然後在處理它之前更改visitedNodes!
  • 相關的問題:你總是堆放一遍又一遍相同的visitedNodes

所以一些解決方案將是把在堆棧visitedNodes +元素currentNode的副本。 visitedNodes,也不會改變這樣

如果需要

+0

嗯,你可以仍然打印訪問節點的副本。這裏的主要概念是用「當前處理的所有可能路徑」填充「處理堆棧」,然後讓循環再走另一條路徑並再次執行該過程。所以每條路徑都應該是不變的,每一個「新的可能性」都是當前路徑+下一個可能的移動的副本 – cporte 2012-07-05 19:00:51