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

解决方案 »

  1.   

                                                        "1234"
                                            |                        |                   |
                                (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中。
      

  2.   

    你只在一个分支里打印,当然看不到全过程
    改成这样
    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]
      

  3.   

    程序的作用很显然
    二楼也讲得很清楚了哈
    递归的思路就是:
    对一个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?也很明显咯
    每次递归都是个全新的运算,不能让结果相互影响吧