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;
}
//
}
方式一:打印效果
方式二:打印效果