要想使用递归实现排列组合首先得学会非递归实现排列组合
非递归的排列组合的实现方式如下(只允许实现1、2、3、4之间的排列组合)
package algorithm2;
import java.util.Arrays;
public class Pailiezuhe {
int a[],b[];//a-数组(从一开始数),b-已添加的数字
/**
*
* @param number
*/
public Pailiezuhe() {
a= new int[4];
for(int i=0;i<4;i++) {
a[i] = i+1;
}
b = new int[4];
}
/**
* 展示不同的组合
* @return
*/
public void show() {
for(int j = 1;j<a.length+1;j++) {
a[0] = j;
b[0] = j;
for(int i = 1;i<a.length+1;i++) {
if(i == b[0]) {
continue;
}
a[1] = i;
b[1] = i;
for(int k = 1;k<a.length+1;k++) {
if(k == b[0] || k == b[1]) {
continue;
}
a[2] = k;
b[2] = k;
for(int m = 1;m<a.length+1;m++) {
if(m == b[0] || m == b[1] || m == b[2]) {
continue;
}
a[3] = m;
b[3] = m;
System.out.println(Arrays.toString(a));
}
}
}
}
}
}
代码解释:每次执行for循环代表每一位上的数字(从1到4),(第一个for循环代表第一位第二个for循环代表第二位,以此类推)
而数组b中存储的是已经插入的数字比如第一位上数字为1 就把1写入数组b中并在之后的for循环中遍历b数组,
如果之后的for循环中变量的值等于b数组中的值就直接跳过以防止之后出现相同的数字(如1,1,1,1就是例外)
按照这样运行下去就能得到排列组合的所有结果
根据非递归算法,递归算法代码如下:
package algorithm2;
import java.util.Arrays;
public class Nweishu {
int a[],b[],m1 = 0;//a-数组(从一开始数),b-已添加的数字,m1-排列组合的总数
boolean repeat; //判断是否有重复数字
/**
*
* @param number
*/
public Nweishu(int number) {
if(number<0) return;
a= new int[number];
for(int i=0;i<number;i++) {
a[i] = i+1;
}
b = new int[number];
repeat = false;
}
/** 展示不同的组合
* @return
*/
public void show() {
show2(a,0,a.length);
System.out.println(m1);
}
/**
* 展示不同的组合
* @param a[]-数组,N-第几位,number-一共几位数
* @return
*/
private void show2(int[] a,int N,int number) {
if(number == 0) {
System.out.println(Arrays.toString(a));
m1++;
return;
}
for(int i = 1;i<a.length+1;i++) {
for(int j = 0;j<N;j++) {
if(i == b[j]) {
repeat = true;
}
}
if(repeat == true) {
repeat = false;
continue;
}
a[N] = i;
b[N] = i;
show2(a,N+1,number-1);
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new Nweishu(4).show();
}
}
由于是第一次创作如有不足之处请多多包涵!