[英]How does this recursive permutation code work?
public class Permutation
{
public static void main(String[] args)
{
String str = "ABC";
int n = str.length();
Permutation permutation = new Permutation();
permutation.permute(str, 0, n-1);
}
private void permute(String str, int l, int r)
{
if (l == r)
System.out.println(str);
else
{
for (int i = l; i <= r; i++)
{
str = swap(str,l,i);
permute(str, l+1, r); ``
str = swap(str,l,i);
}
}
}
public String swap(String a, int i, int j)
{
char temp;
char[] charArray = a.toCharArray();
temp = charArray[i] ;
charArray[i] = charArray[j];
charArray[j] = temp;
return String.valueOf(charArray);
}
}
我不明白這段代碼如何生成字符串的排列
str = swap(str,l,i);
permute(str, l+1, r);
str = swap(str,l,i);
permute
方法打印到標准 output 通過將索引中的字符從l
置換到r
可以從str
獲得的所有字符串。 假設l <= r
。
這回答了你的問題了嗎? 好吧,至少它是答案的核心部分。
我相信標記空間有一個好處:研究在調試器中運行的遞歸方法。 觀察調用堆棧的增長和收縮,並檢查堆棧幀和其中的變量。
與此同時,我的貢獻是我思考遞歸方法的方式。 對我來說,編寫遞歸方法是編寫調用尚未實現的方法的代碼的一種特殊情況。 相信它可以並且將在以后實施。 我希望您熟悉這種編寫代碼的方式。
我上面的第一段指定了permute
方法的行為。 讓我們研究一下實現是如何實現這種行為的。
首先,如果l
和r
相等,即它們指向同一個字符,則不需要交換,因為只有一個排列,即該字符已經在正確位置的排列。 所以打印str
並退出。
如果l
嚴格小於r
,則該方法依次將范圍內的每個字符放入 position l
中。 這是獲得所有排列所必需的。 對於放在l
的每個字符,它以所有可能的方式在剩余位置置換所有剩余字符,即l + 1
到r
。 它是如何做到的? 好吧,我們已經指定了一個可以為我們做這件事的方法,所以只需調用那個方法。 如果它讓您感到困惑,我們調用的方法是我們已經使用的方法,請暫時不要考慮這個事實。 假設我們正在調用我們信任的不同方法來完成這項工作。 最后,在調用該方法之后,我們將字符交換回原來的位置,以便為下一次循環做好准備。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.