簡體   English   中英

生成長度為 N 的數字的所有排列

[英]Generate all permutations of digits of length N

我正在嘗試制作一個模式,其中 N 個數字 0-9 以各種可能的順序顯示。

class Main {
  public static void perms(int[] arr, int i) {
    if (i == arr.length) {
      for (int j=0; j<arr.length; j++)
        System.out.print(arr[j] + " ");
      System.out.println();
      return;
    }

    for (int j=i; j<arr.length; j++) {
      for (int k=0; k<=9; k++) {
        arr[j] = k;
        perms(arr, j+1);
      }
    }
  }

  public static void main(String[] args) {
    perms(new int[]{0,0}, 0);
  }
}

這是我正在尋找長度為 2 的數組的輸出:

0 0  
0 1  
0 2  
0 3  
0 4  
0 5  
0 6  
0 7  
0 8  
0 9  
1 0  
1 1  
1 2  
1 3  
1 4  
1 5  
1 6  
1 7  
1 8  
1 9   
2 0  
2 1  
2 2  
2 3  
2 4  
2 5  
2 6  
2 7  
2 8  
2 9   
3 0  
3 1  
3 2  
3 3  
3 4  
3 5  
3 6  
3 7  
3 8  
3 9  
4 0  
4 1  
4 2  
4 3  
4 4  
4 5  
4 6  
4 7  
4 8  
4 9  
5 0  
5 1  
5 2  
5 3  
5 4  
5 5  
5 6  
5 7  
5 8  
5 9  
6 0   
6 1  
6 2   
6 3  
6 4  
6 5  
6 6  
6 7  
6 8  
6 9  
7 0  
7 1  
7 2  
7 3  
7 4  
7 5  
7 6  
7 7  
7 8  
7 9  
8 0  
8 1  
8 2  
8 3  
8 4  
8 5   
8 6  
8 7  
8 8  
8 9  
9 0   
9 1  
9 2  
9 3  
9 4  
9 5   
9 6  
9 7  
9 8  
9 9  

它有效,但有一個額外的輸出:

9 0  
9 1  
9 2  
9 3  
9 4  
9 5  
9 6  
9 7  
9 8  
9 9   

在我運行它的最后。 為什么會發生這種情況,我該如何擺脫它?

我對遞歸函數的建議是你應該總是畫一個圖表來模擬你的編碼過程。 為您計划: 在此處輸入圖片說明

然后您可以簡單地注意到,在level 1in loop k > 9您已經打印了所有您需要的數字,而程序不會停止,而是out loop j將變為1並開始下一個循環。 這就是您有額外{9, 0~9}

要理解為什么會發生這種情況,在這個循環中(參考級別 1),當j == 1 ,變量arr = {9, 9} (來自最后一個循環操作,當out loop j == 0 )。 也就是說,內部循環arr[j] = k正在修改數組中的第二個變量arr[1] 此操作與level 2相同。

一種可能的解決方案:

public class Main {
  public static void perms(int[] arr, int i) {
    if (i == arr.length) {
      for (int j=0; j<arr.length; j++)
        System.out.print(arr[j] + " ");
      System.out.println();
      return;
    }

    for (int j=i; j<arr.length; j++) {
      for (int k=0; k<=9; k++) {
        arr[j] = k;
        perms(arr, j+1);
      }

      // if arr = {9, 9}, break;
      // this cannot put above the inner loop, I will 
      // leave that for you to think why
      if(arr[0] == 9 && arr[1] == 9){
        return;
      }
    }
  }

  public static void main(String[] args) {
    perms(new int[]{0,0}, 0);
  }
}

或者檢查這個答案

暫無
暫無

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

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