2017-04-21 94 views
-4

難以找出如何將此遞歸方法更改爲迭代方法,任何人都有任何有用的指針?我得到了遞歸方法的工作方式,但不太清楚轉換爲迭代的步驟,謝謝。在你的代碼將遞歸循環更改爲迭代

private static void printFriends(Friend friend, int distance) { 
     if (distance == 0) { 
      System.out.println(friend); 
     } else { 
      for (Friend f : friend.getFriends()) { 
       System.out.println(f + "0"); 
       printFriends(f, distance - 1); 
      } 
     } 
    } 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 
     List<Friend> friendList = new ArrayList<Friend>(); 

     Friend reuben = new Friend("Reuben"); 
     Friend soumitra = new Friend("Soumitra"); 
     Friend ken = new Friend("Ken"); 
     Friend elisa = new Friend("Elisa"); 
     Friend isaac = new Friend("Isaac"); 

     friendList.add(reuben); 
     friendList.add(soumitra); 
     friendList.add(ken); 
     friendList.add(elisa); 
     friendList.add(isaac); 

     reuben.addFriend(soumitra); 
     reuben.addFriend(ken); 

     soumitra.addFriend(reuben); 

     ken.addFriend(reuben); 
     ken.addFriend(elisa); 

     elisa.addFriend(ken); 
     elisa.addFriend(isaac); 

     isaac.addFriend(elisa); 

     BufferedReader inputReader = new BufferedReader(new InputStreamReader(System.in)); 
     String inputName = ""; 
     String inputValue = ""; 
     Friend inputFriend = null; 
     int inputInt = 0; 

     System.out.println("Blank entry at any prompt exits program."); 

     while (true) { 
      System.out.print("Enter a person's name: "); 
      try { 
       inputName = inputReader.readLine(); 
      } catch (IOException e) { 
       System.err.println("Error reading from console."); 
      } 

      if (inputName.equals("")) { 
       System.out.println("Run complete."); 
       System.exit(0); 
      } 

      inputFriend = new Friend(inputName); 

      if (friendList.contains(inputFriend)) { 
       inputFriend = friendList.get(friendList.indexOf(inputFriend)); 
       System.out.print("Enter a non-negative integer: "); 
       try { 
        inputValue = inputReader.readLine(); 
       } catch (IOException e) { 
        System.err.println("Error reading from console."); 
       } 

       if (inputValue.equals("")) { 
        System.out.println("Run complete."); 
        System.exit(0); 
       } 

       try { 
        inputInt = Integer.valueOf(inputValue); 
       } catch (NumberFormatException e) { 
        System.err.println("Must enter integer."); 
        continue; 
       } 

       if (inputInt < 0) { 
        System.out.println("Must be non-negative"); 
       } else { 
        printFriends(inputFriend, inputInt); 
       } 
      } else { 
       System.out.println(inputFriend + " not found."); 
      } 
     } 
    } 
} 
+1

[從遞歸到迭代的方式]可能的重複(http://stackoverflow.com/questions/159590/way-to-go-from-recursion-to-iteration) – azurefrog

+1

請參閱:[爲什麼是「有人可以幫我嗎?「不是一個真正的問題?](http://meta.stackoverflow.com/q/284236) – EJoshuaS

回答

1

來看,似乎你正在使用的「距離」參數作爲計數器的朋友要打印的份數,因此次數遞歸調用該方法。您可以使用for循環或while循環構造輕鬆地轉換它,並使用distance參數作爲循環的終止條件。我會推薦for循環,因爲它有助於簡化代碼。

對於循環結構:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html

for (int i = 0; i < distance; i++) { 
//list.get(i); 
//printfriends + "0" 
} 

請務必熟悉所有Java中的基本循環結構。

+0

我明白這是如何彌補的距離,但它會知道如何知道朋友的朋友根據距離和每次重新啓動? – snipshow7

+0

您需要在您的問題中包含更多詳細信息,說明您希望此方法實現的目標是什麼,因爲它不清楚代碼示例。爲什麼你不能使用遞歸是否有特定的原因?你是按照特定的順序打印朋友的朋友嗎?你有沒有考慮過這種數據結構?到目前爲止,它看起來像樹型數據結構,通常需要遞歸而不是迭代。爲他們應該打印的訂單繪製圖表也將非常有幫助。 – PandaK