package com.csdn;import java.util.ArrayList;
import java.util.Arrays;public class Permutation { /**
* @param args
*/
public static void main(String[] args) {
System.out.println(Arrays.toString(permutation("1234"))); } private static String[] permutation(String orginal) {
ArrayList<String> list = new ArrayList<String>();
if (orginal.length() == 1) {
return new String[] { orginal };
} else {
for (int i = 0; i < orginal.length(); i++) {
String s = orginal.charAt(i) + "";
String result = "";
String resultA = result + s;
String leftS = orginal.substring(0, i)
+ orginal.substring(i + 1, orginal.length());
for (String element : permutation(leftS)) {
result = resultA + element;
System.out.println("result=" + result);
System.out.println("--------------------");
list.add(result);
} }
return (String[]) list.toArray(new String[list.size()]);
}
}}我知道是用了递归,但是具体的流程我头还是有点晕,呵呵,谁能帮帮我啊,我在后台打出来的时候为什么有一些result没有放到list里面去呢??也许是这边递归的时候重新new了个List,但这样反反复复真的很晕呀,谁能告诉我哈
--------------------
result=43
--------------------
result=234
--------------------
result=243
--------------------
result=24
--------------------
result=42
--------------------
result=324
--------------------
result=342
--------------------
result=23
--------------------
result=32
--------------------
result=423
--------------------
result=432
--------------------
result=1234
--------------------
result=1243
--------------------
import java.util.Arrays;public class Permutation { /**
* @param args
*/
public static void main(String[] args) {
System.out.println(Arrays.toString(permutation("1234"))); } private static String[] permutation(String orginal) {
ArrayList<String> list = new ArrayList<String>();
if (orginal.length() == 1) {
return new String[] { orginal };
} else {
for (int i = 0; i < orginal.length(); i++) {
String s = orginal.charAt(i) + "";
String result = "";
String resultA = result + s;
String leftS = orginal.substring(0, i)
+ orginal.substring(i + 1, orginal.length());
for (String element : permutation(leftS)) {
result = resultA + element;
System.out.println("result=" + result);
System.out.println("--------------------");
list.add(result);
} }
return (String[]) list.toArray(new String[list.size()]);
}
}}我知道是用了递归,但是具体的流程我头还是有点晕,呵呵,谁能帮帮我啊,我在后台打出来的时候为什么有一些result没有放到list里面去呢??也许是这边递归的时候重新new了个List,但这样反反复复真的很晕呀,谁能告诉我哈
--------------------
result=43
--------------------
result=234
--------------------
result=243
--------------------
result=24
--------------------
result=42
--------------------
result=324
--------------------
result=342
--------------------
result=23
--------------------
result=32
--------------------
result=423
--------------------
result=432
--------------------
result=1234
--------------------
result=1243
--------------------
| | |
(1) | (2) | (3) | (4)
"234" | "134" | "124" | "123"
| | |
(2) | (3) | (4) | (1) (3) (4) | (1) (2) (4) | 1 2 3
"34" | "24" | "23" | "34" "14" "13" | "24" "14" "12"| "23" "13" "12"
| | | | |
3 4 | 2 4 | 2 3 | 3 4 1 4 1 3 | 2 4 1 4 1 2 | 2 3 1 3 1 2
"4" "3" |"4" "2"|"3" "2"| "4" "3" "4" "1" "3" "1"| 字符串从"1234" 分为{1}"234" (2)"134" (3)"124" (4)"123" 按同样的规则一直往下分,直到只有一个字符为止。
再从下往上,按分下来的顺序倒着依次把分出来的单个儿的字符,插入到字符串最前面。再把这个字符串,加到一个List中。
改成这样
package com.csdn;import java.util.ArrayList;
import java.util.Arrays;public class Permutation { /**
* @param args
*/
public static void main(String[] args) {
System.out.println(Arrays.toString(permutation("1234"))); } private static String[] permutation(String orginal) {
ArrayList<String> list = new ArrayList<String>();
String[] ret = new String[0];
if (orginal.length() == 1) {
ret = new String[] { orginal };
} else {
for (int i = 0; i < orginal.length(); i++) {
String s = orginal.charAt(i) + "";
String result = "";
String resultA = result + s;
String leftS = orginal.substring(0, i)
+ orginal.substring(i + 1, orginal.length());
for (String element : permutation(leftS)) {
result = resultA + element; list.add(result);
} }
ret = (String[]) list.toArray(new String[list.size()]);
}
System.out.println("return = " + Arrays.toString(ret));
System.out.println("--------------------");
return ret;
}}
结果
return =[4]
--------------------
return =[3]
--------------------
return =[34, 43]
--------------------
return =[4]
--------------------
return =[2]
--------------------
return =[24, 42]
--------------------
return =[3]
--------------------
return =[2]
--------------------
return =[23, 32]
--------------------
return =[234, 243, 324, 342, 423, 432]
--------------------
return =[4]
--------------------
return =[3]
--------------------
return =[34, 43]
--------------------
return =[4]
--------------------
return =[1]
--------------------
return =[14, 41]
--------------------
return =[3]
--------------------
return =[1]
--------------------
return =[13, 31]
--------------------
return =[134, 143, 314, 341, 413, 431]
--------------------
return =[4]
--------------------
return =[2]
--------------------
return =[24, 42]
--------------------
return =[4]
--------------------
return =[1]
--------------------
return =[14, 41]
--------------------
return =[2]
--------------------
return =[1]
--------------------
return =[12, 21]
--------------------
return =[124, 142, 214, 241, 412, 421]
--------------------
return =[3]
--------------------
return =[2]
--------------------
return =[23, 32]
--------------------
return =[3]
--------------------
return =[1]
--------------------
return =[13, 31]
--------------------
return =[2]
--------------------
return =[1]
--------------------
return =[12, 21]
--------------------
return =[123, 132, 213, 231, 312, 321]
--------------------
return =[1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431,
3124, 3142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 4321]
--------------------
[1234, 1243, 1324, 1342, 1423, 1432, 2134, 2143, 2314, 2341, 2413, 2431, 3124, 3
142, 3214, 3241, 3412, 3421, 4123, 4132, 4213, 4231, 4312, 4321]
二楼也讲得很清楚了哈
递归的思路就是:
对一个string的全排列,可以拆分为依次将每个字符作为第一个字符 + 剩下所有字符的全排列
具体到1234,全排列就是
"1" + "234"的全排列、"2" + "134"的全排列、"3" + "124"的全排列、"4" + "123"的全排列而"234"、"134"、"124"、"123"的全排列又可以继续拆分,依此递归,直到只剩一个字符,就可以求出结果了我们看其中一段结果,就可以看清楚这个过程了
return =[4]
--------------------
return =[3]
--------------------
return =[34, 43]
--------------------
return =[4]
--------------------
return =[2]
--------------------
return =[24, 42]
--------------------
return =[3]
--------------------
return =[2]
--------------------
return =[23, 32]
--------------------
return =[234, 243, 324, 342, 423, 432]
这段结果显然就是求"234"的全排列了
而其中
return =[4]
--------------------
return =[3]
--------------------
return =[34, 43]
--------------------
显然就是求"34"的全排列
"34"的全排列,按前所述,先固定"3"作为第一个字符,"4"的全排列自然就一种
这就是第一个输出 return = [4]
再固定"4"作为第一个字符,"3"的全排列自然也就一种
这就是第一个输出 return = [3]
连接起来就得到了"34"的全排列
return =[34, 43]其他的就依此类推吧为什么每次迭代新定义list?也很明显咯
每次递归都是个全新的运算,不能让结果相互影响吧