簡體   English   中英

這個遞歸排列代碼是如何工作的?

[英]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方法的行為。 讓我們研究一下實現是如何實現這種行為的。

首先,如果lr相等,即它們指向同一個字符,則不需要交換,因為只有一個排列,即該字符已經在正確位置的排列。 所以打印str並退出。

如果l嚴格小於r ,則該方法依次將范圍內的每個字符放入 position l中。 這是獲得所有排列所必需的。 對於放在l的每個字符,它以所有可能的方式在剩余位置置換所有剩余字符,即l + 1r 它是如何做到的? 好吧,我們已經指定了一個可以為我們做這件事的方法,所以只需調用那個方法。 如果它讓您感到困惑,我們調用的方法是我們已經使用的方法,請暫時不要考慮這個事實。 假設我們正在調用我們信任的不同方法來完成這項工作。 最后,在調用該方法之后,我們將字符交換回原來的位置,以便為下一次循環做好准備。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM