使用递归实现排列组合的打印

要想使用递归实现排列组合首先得学会非递归实现排列组合
非递归的排列组合的实现方式如下(只允许实现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();
 }

}

由于是第一次创作如有不足之处请多多包涵!


发布了2 篇原创文章 · 获赞 3 · 访问量 412

猜你喜欢

转载自blog.csdn.net/qq_31236027/article/details/84873007