2014-01-21 94 views
6

我是一名java初學者,並試圖從java編程書籍中進行字符串排列實踐。我定義兩個方法:帶遞歸的字符串排列

public static void displayPermutation(String s) 
public static void displayPermutation(String s1, String s2) 

第一種方法只是調用displayPermutation(" ", s)。第二種方法使用循環將字符從s2移動到s1,並用新的s1和s2遞歸調用它。基本情況是s2是空的並將s1打印到控制檯。

任何人都可以幫助我找到下面的代碼是什麼問題?

她的例子:

public static void displayPermutation(String s) { 
      displayPermuatation("", s); 
     } 

    private static void displayPermuatation(String s1, String s2) { 
     //base case: when s2 is empty, print s1 
     if (s2.isEmpty()) { 
      System.out.println(s1); 
     } 
     else {   
     for (int i = 0; i < s2.length(); i++) { 
         //move a char from s1 to s2, and recursively invokes it with 
         //new s1 and s2 
      s1 = s1 + s2.charAt(i); 
      s2 = s2.substring(0, i) + s2.substring(i+1); 
      displayPermuatation(s1, s2); 
     } 
    } 
    } 

如果s = 「ABC」, 只打印: ABC ACB

似乎在displayPermuatation的第一次調用( 「」, 「ABC」 ),它不完成for循環.... 有什麼意見?

感謝下面的所有評論。我認爲我犯的錯誤是因爲傳遞對象作爲方法的參數實際上是傳遞引用。它不像原始數據(通過值傳遞)。更改對象時,將影響使用該對象的以下方法調用。

+0

什麼應該是正確的結果,當S = 「ABC」? – fmodos

+0

對不起,我忘了把它添加到帖子中。預期的結果是:abc,acb,bac,bca,cab,cba – Vortex

+0

您是否嘗試過在調試器下運行它,或者將打印輸出放入displayPermutation例程中以查看它實際在做什麼(而不是您認爲它正在做什麼)?我想你可以用這些信息自己弄清楚。 – keshlam

回答

2

您的代碼存在的問題是您正在更改循環中s1和s2的值,這會影響循環中的以下迭代,請參閱下面的代碼,我已解決此問題。

public static void displayPermutation(String s) { 
    displayPermuatation("", s); 
} 

private static void displayPermuatation(String s1, String s2) { 
    // base case: when s2 is empty, print s1 
    if (s2.isEmpty()) { 
     System.out.println(s1); 
    } else { 
     for (int i = 0; i < s2.length(); i++) { 
      // move a char from s1 to s2, and recursively invokes it with 
      // new s1 and s2 
      displayPermuatation(s1 + s2.charAt(i), s2.substring(0, i) + s2.substring(i + 1)); 
     } 
    } 
} 
+0

謝謝!這樣可行!我將編輯我的帖子,添加一些評論以供將來參考。 – Vortex

5

不要改變循環,導致錯誤s1s2。只需將這些定義作爲參數傳遞給遞歸函數即可。就像這樣:

. 
. 
for (int i = 0; i < s2.length(); i++) { 
     displayPermuatation(s1 + s2.charAt(i), s2.substring(0, i) + s2.substring(i+1)); 
    } 
. 
. 
+0

非常感謝! – Vortex

1

不要更改環路s1s2原始值:

private static void displayPermuatation(String s1, String s2) { 
    //base case: when s2 is empty, print s1 
    if (s2.isEmpty()) { 
     System.out.println(s1); 
    } 
    else {  
    for (int i = 0; i < s2.length(); i++) { 
        //move a char from s1 to s2, and recursively invokes it with 
        //new s1 and s2 
     string new_s1 = s1 + s2.charAt(i); 
     string new_s2 = s2.substring(0, i) + s2.substring(i+1); 
     displayPermuatation(new_s1 , new_s2); 
    } 
}