2017-10-10 161 views
0

我得到了下面的代碼,它的功能如下:你調用該方法並給它一個數字。它會打印出你輸入的數字的所有排列組合。返回變量變量(Java)

例如:調用等方法:

置換(3)

它將打印出:

123,132,213,231,312, 321,

這裏是代碼:

public static void main(String[] args) { 
    permutations(3); 
} 

public static void permutations(int n) { 
    boolean used[] = new boolean[n]; //all set to false by default 
    int perm[] = new int[n]; 
    permutations2(used, 0, perm); 
} 

private static void permutations2(boolean used[], int index, int perm[]) { 
    if (index == used.length) { 
     for (int i = 0; i < perm.length; i++) { 
      System.out.print(perm[i] + ""); 
     } 
     System.out.print(", "); 
     return; 
    } 

    for (int i = 0; i < used.length; i++) { 
     if (!used[i]) { 
      used[i] = true; 
      perm[index] = i + 1; 
      permutations2(used, index + 1, perm); 
      used[i] = false; 
     } 
    } 

} 

我的問題是在返回聲明。當由於某種原因調用返回值時,變量'index'會改變。有誰能向我解釋爲什麼會發生這種情況?代碼工作正常,我只是無法理解如何。

對不起,對英文不好。

+1

這是一個遞歸算法,因此'index'的新值被作爲參數壓入堆棧,但對於調用者來說,值保持不變。提示:在您的IDE中,在進行遞歸調用之前設置一個斷點,並查看函數如何變得更深,然後返回。 –

+1

它不會改變。如果你可以確切地指明它是什麼讓你認爲它確實如此,我們可以解釋。請記住,您多次調用相同的函數,堆疊在一起,並且每個都獲得自己的變量副本。 – chrylis

+0

'索引'的值不會改變,只要您沒有爲其指定一個新的值就不會改變! – BaSsGaz

回答

0

permutations2是一個遞歸函數,你遞歸調用它的索引+ 1

當達到遞歸的基本情形,即指數== used.length,回叫和代碼放在一個遞歸調用回到索引是一個更小的時候。