import java.util.Arrays;
/* 問題:輸入一個數n(0<x<10),輸入由1-n組成的所有可組成的數
*
* 例:
* 輸入:3
* 輸出:
* 1,2,3,
* 12,13,21,23,31,32,
* 123,132,213,231,312,321
*
*/
public class Test2 {
public static void main(String[] args) {
new Test2().show(3);
}
public void show(int n){
for(int i=1;i<=n;i++){ //用於控制打印位數
int[] arr = new int[i]; //創建存儲各個位數的數據的數組
degui(n,arr,0,i); //遞歸入口
}
}
// n代表組合數上限,arr是存儲每位數的數組, i是在本次遞歸中數放在數組中的位置下標,m是數的位數
public void degui(int n,int[] arr,int i,int m){
if(i==m){ //如果本次所放的位置達到本次的最大位數,則結束,並打印,遞歸出口
int num=0;
for(int j=0;j<arr.length;j++){
num=num*10+arr[j];
}
System.out.println(num);
return;
}
//在該位置上可以放置的數,輪着放
for(int x=1;x<=n;x++){
if(!have(arr,x,i)){ //判斷在該位置放的數在之前的位置中是否已經存在,不存在時纔可以放入
arr[i]=x;
degui(n,arr,i+1,m); //該位置放好數,就放下一位置的數,i+1
}
}
}
//------------打印方式2,數組的方式-------------------------
public void show2(int n){
for(int i=1;i<=n;i++){
int[] arr = new int[i];
degui2(n,arr,0,i);
}
}
public void degui2(int n,int[] arr,int i,int m){
if(i==m){
System.out.println(Arrays.toString(arr));
return;
}
for(int x=1;x<=n;x++){
if(!have(arr,x,i)){
arr[i]=x;
degui2(n,arr,i+1,m);
}
}
}
public boolean have(int[] arr,int x,int s){
for(int i=0;i<s;i++){
if(arr[i]==x){
return true;
}
}
return false;
}
//
}
方式一:打印效果
方式二:打印效果