N个字母全排列

求 n个元素的全排列。利用递归的方式实现。

题目分析


例如对 abc 进行全排列,则所有结果为:
abc acb bac bca cab cba
分析易知:分别把各个字母放在首字母位置,然后其他的所有字母进行全排列, 这就有了构造的相似性,也就可以使用递归的思想。

public class N个元素全排列 {
    public static void main(String[] args) {
        char[] c = "ABCDE".toCharArray();
        f(c, 0);
    }

    /**
     * 递归实现n个元素的全排列
     * 
     * @param c
     *            数组名
     * @param k
     *            当前的交换位置,与其后的元素交换
     */
    private static void f(char[] c, int k) {
        // 注意: 程序的出口由for循环控制
        for (int i = k; i < c.length; i++) {
            char temp = c[k];
            c[k] = c[i];
            c[i] = temp;

            f(c, k + 1);// 递归调用

            // 回溯
            // 交换完之后一定要换回原始数据,否则后边的交换就会变乱
            temp = c[k];
            c[k] = c[i];
            c[i] = temp;

        }

        // 输出
        if (k == c.length) {// 换完一轮之后打印结果
            for (char d : c) {
                System.out.print(d + " ");
            }
            System.out.println();
        }
    }
}

总结

1 构造递归时,参数k是关键, 递归的关键是构造相似性(相似非相同),若没有这个参数k,那么递归长度不会变,就会变成死循环,所以要多一个参数。
2 在解决交换位置的题目时,交换之后一定要重新换回来,便于接下来的交换,否则会乱。这称之为 回溯 。类似的还有 八皇后问题、迷宫问题

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值