import java.util.ArrayList;
public class test {
static ArrayList<String> list = new ArrayList<>();
public static void main(String[] args) {
String[] strs = {"A","B","C","D"};
perm(strs, 0, strs.length);
for(String s:list){
System.out.println(s);
}
list.clear();
}
private static void perm(String[] strs,int start,int end){
String s = "";
if(start==end){
for(int i=0;i<strs.length;i++){
s+=strs[i];
}
list.add(s);
}else{
for(int i=start;i<end;i++){
String str = strs[start];
strs[start] = strs[i];
strs[i] = str;
perm(strs,start+1,end);
strs[i] = strs[start];
strs[start] = str;
}
}
}
}这是在网上找的代码,但是看不太懂,有哪位大神可以详细讲下思路吗?比如每一步的目的是什么,主要是递归那里真的想不通了
1 回答
已采纳
Frank_W毅3947945
TA贡献6条经验 获得超3个赞
首先说一下, static ArrayList<String> list = new ArrayList<>();泛型掉了类型,应该是 new ArrayList<String>();
再说递归,
for(int i=start;i<end;i++){
String str = strs[start];
strs[start] = strs[i];
strs[i] = str;
perm(strs,start+1,end);
strs[i] = strs[start];
strs[start] = str;
先说下递归算法的特点:代码简洁,但逻辑性比较强,理解起来要难一些。再说一下这段程序,关键是上面这段代码的理解,相信你其他的应该都可以看懂。这段代码是指先交换数组strs[i]和strs[start]的值(注意:这个时候数组strs[i]和strs[start]的值已经互换了,已经改变了),再对satrt加一,进行函数递归,最后又把strs[i]和strs[start]的值还原回来(这个时候恢复成为原来的数组)。当start==end的时候,list列表添加入此时数组strs的所有字符串。说的可能比较抽象,你不妨试试几组数据,分别把start,end 设为0,2;0,3;1,3;1;4自己试着写一下,找到思路。这个程序主要是对数组内元素,第start到end元素进行排列组合。并列出所有可能的排列值
添加回答
举报
0/150
提交
取消