package edu.cqu.algorithmTest;

import java.util.Scanner;

// 全排列,递归实现
public class Main8 {
public static void main(String[] args) {
int[] arr = { 1, 2, 3};
bfs(arr, 0, arr.length - 1);
} public static void bfs(int []a,int start,int end) {
/*
* 递归的终点是,我们拿着start去逐个和后面的集合考虑要不要交换:
* 当需要交换时,我们交换,start+1
* 当不需要交换时,我们不交换,start还是要加1,因为我们要靠着start进入递归的最底层
* 一直start比较到最后了,交不交换都反正都结束了,我们打印处结果。然后返回到递归的上一层。
* 在上一层(我们的start后退一步),搜索是否应该和start交换的i也加1了。
* 如处理{1,2,3}全排列
* 相当于在处理完{2,3}的全排列后,
* 我们回到上一层,start到了{1},此时需要考虑将{1} 和{2,3}里面交换。i就是去寻找2,3的
*
*
* */
if(start == a.length) {
for(int i:a) {
System.out.print(i);
}
System.out.println(); } for(int i = start;i < a.length;i++) {
if(isUnique(a,start,i)) {
swap(a,start,i);
bfs(a,start+1,i);
/*
* 为什么要再交换呢?
* 你比如还是{1,2,3},我拿着{1}去交换{2,3}中间的{2},交换完成之后,
* 显然成了{2} {1,3} 即2,1,3和2,3,1
* 但是,我还要拿{1}去换{2,3}中的3啊,数组成了[2,1,3][2,3,1]我再拿第一个位置交换第三个位置显然乱套
* 所以,我们恢复原样。当递归完成,回到上一层的时候,上一层的start,i还在哪给你记着呢,你本来换了哪个数
* 原原本本给换回来。每一层都一样,所以不会乱。
*
*
* */
swap(a,start,i);
} }
} static boolean isUnique(int a[],int start,int end ) {
/*
* //如果在需要被交换的数a[end]之前出现了和它一样的数,例如{1}想要交换到{2,3,4}中的4没有问题,
* 换完之后组成新的集合{2,3,1}进行递归,递归会处理好{2,3,1}的全排列
* 但是如果{1}想要和{4,3,4}中的后面一个4进行交换就需要排除,因为当{1}和第一个4交换,已经将{1,3,4}的全排列
* 结果全部给出了。
* 因此,我们逐个检查a[end]这个元素之前,有没有和它 一样的数
*
*
* */
for(int i = start ;i < end; i++) {
if(a[i] == a[end]) {
return false;
}
}
return true;
} public static void swap(int []a,int m,int n) {
int t = a[m];
a[m] = a[n];
a[n] = t;
} }

  

Java用递归实现全排列,详细的更多相关文章

  1. 关于java的递归写法,经典的Fibonacci数的问题

    经典的Fibonacci数的问题 主要想展示一下迭代与递归,以及尾递归的三种写法,以及他们各自的时间性能. public class Fibonacci { /*迭代*/ public static ...

  2. Java 集合系列 09 HashMap详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  3. Java 集合系列 10 Hashtable详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. Java 集合系列 06 Stack详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  5. Java 集合系列 05 Vector详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  6. Java 集合系列 04 LinkedList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  7. Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  8. java 中递归的实现 以及利用递归方法实现汉诺塔

    今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...

  9. Java通过JNI调用dll详细过程(转)

    源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无 ...

随机推荐

  1. mysql常用引擎

    经常用MySQL数据库,但是,你在用的时候注意过没有,数据库的存储引擎,可能有注意但是并不清楚什么意思,可能根本没注意过这个问题,使用了默认的数据库引擎,当然我之前属于后者,后来成了前者,然后就有了这 ...

  2. oracle索引2

    问什么问题? 索引有什么代价?哪些场景下你需要建索引?或者有时候反过来问,哪些场景下不推荐建索引. 建好索引之后,怎么才能最高效地利用索引?或者反过来问,请说出一个无法有效利用已建索引的案例. 索引的 ...

  3. abstract class 与 interface

    abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和inte ...

  4. java日志框架系列(2):logback框架详解

    1.logback介绍 1.什么是logback Logback 为取代 log4j 而生. Logback 由 log4j 的创立者 Ceki Gülcü设计.以十多年设计工业级记录系统的经验为基础 ...

  5. 【转载】Jave开发手册之正则表达式预编译

    今天又水一篇,java开发手册华山版 一.编程规约 (九)其它 第一条 解释:Pattern要定义为static final静态变量,以避免执行多次预编译. 错误用法: // 没有使用预编译 priv ...

  6. 11.vim常用操作

    :set nu在命令模式下显示行号 进入输入模式 新增 (append) a :从光标所在位置後面开始新增资料,光标後的资料随新增资料向後移动. A:从光标所在列最後面的地方开始新增资料.   插入 ...

  7. shell习题第18题:检查新文件

    [题目要求] 有一台服务器作为web应用,有一个目录(/data/web/attachment)不定时会被用户上传新的文件,但是不知道什么时候会被上传.所以,需要我们每5分钟做一次检测是否有新文件生成 ...

  8. 怎样使用js将文本复制到系统粘贴板中

    需要使用到三个document方法: 1. document.execCommand(); 执行某个命令 2. document.queryCommandSupported(); 检测浏览器是否支持某 ...

  9. jQuery Validation ,调用valid方法时,不验证remote

    1.问题描述 model代码如下: remote对应的action如下: view代码如下: 单击按钮时,执行如下动作 当点击按钮时,我们发现,虽然后台action验证失败,但 还是执行返回true, ...

  10. 深入浅出GNU X86-64 汇编

    深入浅出GNU X86-64 汇编 来源 https://blog.csdn.net/pro_technician/article/details/78173777 原文 https://www3.n ...