java求组合用递归_Java——递归实现组合

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

1.State类

public class State {

/** 选项集合 */

private Listselections = new ArrayList();

/** 状态名称 */

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 ListgetSelections() {

return selections;

}

}

2组合类,Cmn

public class Cmn {

private Liststates = new ArrayList();

/**

* 数据初始化

*/

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);

}

/**保存组合结果*/

ListmPxStates = new ArrayList();

/**

* 递归寻找组合序列

* @param state

* @param index

*/

public void cmn(State state,int index){

State stateT = this.states.get(index);

Listselections = 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(Liststates){

int num = states.size();

for (int i = 0; i < num; i++) {

State state = states.get(i);

Listselections = 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、付费专栏及课程。

余额充值