用Java实现排列组合
#可重复的排列
import java.util.Stack;
public class 排列_可重复 {
//结果集
static Stack<Integer> stack = new Stack<Integer>();
//树根
static int[] A = new int[] {1,2,3};
//结果位置以及结果数量
static int end = 3,num = 0;
public static void main(String[] args) {
dfs(0);
System.out.println(num);
}
//n:此时已经选了n个元素放进了结果集
static void dfs(int n) {
//边界情况
if(n == end) {
System.out.println(stack);
num++;
return;
}
//一般情况
if(n < end) {
for(int i = 0; i < end; i++) {
stack.add(A[i]);
dfs(n+1);
stack.pop();
}
}
}
}
#不可重复的排列(全排列)
import java.util.Stack;
public class 排列_不可重复 {
//结果集
static Stack<Integer> stack = new Stack<>();
//树根
static int[] tree = new int[]{1,2,3,4};
//结果位置与结果数量
static int num = 0, end = tree.length;
public static void main(String[] args) {
dfs(0);
System.out.println(num);
}
//n:此时已经选了n个元素放进了结果集
static void dfs(int n) {
if(n == end) {
System.out.println(stack);
num++;
return;
}
if(n < end) {
for(int i = 0; i < end; i++) {
if(!stack.contains(tree[i])) {
stack.add(tree[i]);
dfs(n+1);
stack.pop();
}
}
}
}
}
#组合
import java.util.Stack;
public class 组合 {
//结果集
static Stack<Integer> stack = new Stack<>();
//结束位置与结果数量
static int end = 3, num = 0;
//树根
static int[] tree = new int[]{1,2,3,4};
public static void main(String[] atds) {
dfs(0,0);
System.out.println(num);
}
//n:此时已经选了n个元素放进了结果集 m:区别排列与组合的关键
static void dfs(int n, int m) {
if(n == end) {
System.out.println(stack);
num++;
return;
}
for(int i = m; i < tree.length; i++) {
if(!stack.contains(tree[i])) {
stack.add(tree[i]);
dfs(n+1,i);
stack.pop();
}
}
}
}