Java——递归实现组合

需求:一个模型中有n个状态,每个状态有m个选项,如果从每个状态中选取一个选项进行组合,总共有多少种组合。

1.State类

public class State {

	/** 选项集合 */
	private List<String> selections = new ArrayList<String>();
	/** 状态名称 */
	private String mName;

	public State(String name) {

		this.mName = name;
	}

	public State() {

	}

	public String getName() {
		return mName;
	}

	public void setName(String mName) {
		this.mName = mName;
	}

	public void addSelection(String selection) {

		selections.add(selection);
	}

	public String getSelection(int index) {

		return this.selections.get(index);
	}

	public int selectionNum() {

		return this.selections.size();
	}

	public List<String> getSelections() {
		return selections;
	}

}

2组合类,Cmn

public class Cmn {
	
	
	private List<State> states = new ArrayList<State>();
	
	/**
	 * 数据初始化
	 */
	public Cmn(){
		
		State state1 = new State("State1");
		state1.addSelection("State1_Selection1");
		state1.addSelection("State1_Selection2");
		State state2 = new State("State2");
		state2.addSelection("State2_Selection1");
		State state3 = new State("State3");
		state3.addSelection("State3_Selection1");
		State state4 = new State("State4");
		state4.addSelection("State4_Selection1");
		state4.addSelection("State4_Selection2");
		state4.addSelection("State4_Selection3");
		addState(state1);
		addState(state2);
		addState(state3);
		addState(state4);
	}
	
	private void addState(State state){
		this.states.add(state);
	}

	/**
	 * 计算组合
	 */
	public void cmn(){
		System.out.println("初始状态");
		printState(this.states);
		System.out.println("组合结果");
		State state = new State("CMN");
		int index = 0;
		cmn(state,index);
		printState(this.mPxStates);
		
	}
	
	/**保存组合结果*/
	List<State> mPxStates = new ArrayList<State>();
	
	/**
	 * 递归寻找组合序列
	 * @param state
	 * @param index
	 */
	public void cmn(State state,int index){
		
		State stateT = this.states.get(index);
		List<String> selections = stateT.getSelections();
		int sNum = selections.size();
		for (int i = 0; i < sNum; i++) {
			
			String selection = selections.get(i);
			State state2 = new State(); //保存上一个state信息并添加当前selection
			state2.getSelections().addAll(state.getSelections());
			state2.addSelection(selection);
			
			if(index+1 == this.states.size()){//找到一个组合序列
				state2.setName("CMN "+(mPxStates.size()+1));
				mPxStates.add(state2);
			}else{//继续找
				int index2 = index+1;
				cmn(state2,index2);
			}
			
		}
	}
	
	public void printState(List<State> states){
		
		int num = states.size();
		for (int i = 0; i < num; i++) {
			
			State state = states.get(i);
			List<String> selections = state.getSelections();
			System.out.println("----------"+state.getName()+"-----------");
			int num2= selections.size();
			for (int j = 0; j < num2; j++) {
				String selection = state.getSelection(j);
				System.out.println(j+"----->"+selection);
			}
			System.out.println();
		}
	}

}
3 Main

public class Main {
	
	public static void main(String[] args){
		
		new Cmn().cmn();
	}

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值