组合问题,利用递归回溯法,通过集合保存集合中的数据,递归方法内可以正常输出。mian方法里输出却为空。
import java.util.*;
public class Backtracking {
//组合问题
//存放单组数据
static List<Integer> data=new ArrayList<Integer>();
static List<String> result=new ArrayList<>();
static List<List> result2=new ArrayList<>();
public static void main(String[] args) {
diGui(4,2,1);
System.out.println("这是保存的字符串结果:"+result);
System.out.println("这是保存的集合结果:"+result2);
}
//n表示有多少个数,K表示遍历到第几层,startIndex从哪里开始遍历(当前遍历到的层数)
public static void diGui(int n,int k,int startIndex){
//定义集合临时接收数据
if(data.size()==k){
StringBuffer sb=new StringBuffer();
for (int i = 0; i < data.size(); i++) {
sb.append(data.get(i));
}
result2.add(data);
System.out.println("这是保存的集合结果:"+result2);
result.add(sb.toString());
return;
}
for(int i=startIndex;i<=n;i++){
//将每一层的数据加入到结果集中
data.add(i);
//开始递归深度遍历
diGui(n,k,i+1);
//回溯删除加入的元素
data.remove(data.size()-1);
}
}
}
这是保存的集合结果:[[1, 2]]
这是保存的集合结果:[[1, 3], [1, 3]]
这是保存的集合结果:[[1, 4], [1, 4], [1, 4]]
这是保存的集合结果:[[2, 3], [2, 3], [2, 3], [2, 3]]
这是保存的集合结果:[[2, 4], [2, 4], [2, 4], [2, 4], [2, 4]]
这是保存的集合结果:[[3, 4], [3, 4], [3, 4], [3, 4], [3, 4], [3, 4]]
这是保存的字符串结果:[12, 13, 14, 23, 24, 34]
这是保存的集合结果:[[], [], [], [], [], []]
main方法中可以正常输出result2中的数据。
list是引用类型
你result2中的每个元素是data
而data始终只有一个
你在函数里不new它,而是不断的给它填充数据之后又把数据删掉
最终data里面是空的,什么都没有
因为result2中的每个元素是data
你是想把每次data得到的值存入到result2里面吧,但你不知道这么做只是指向data的地址,每次data修改的时候,result里面的data也会跟着修改。解决办法就是copy一下,copy一个跟data一样的数组存到result2中
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!