1. package edu.cqu.algorithmTest;
  2.  
  3. import java.util.Scanner;
  4.  
  5. // 全排列,递归实现
  6. public class Main8 {
  7. public static void main(String[] args) {
  8. int[] arr = { 1, 2, 3};
  9. bfs(arr, 0, arr.length - 1);
  10. }
  11.  
  12. public static void bfs(int []a,int start,int end) {
  13. /*
  14. * 递归的终点是,我们拿着start去逐个和后面的集合考虑要不要交换:
  15. * 当需要交换时,我们交换,start+1
  16. * 当不需要交换时,我们不交换,start还是要加1,因为我们要靠着start进入递归的最底层
  17. * 一直start比较到最后了,交不交换都反正都结束了,我们打印处结果。然后返回到递归的上一层。
  18. * 在上一层(我们的start后退一步),搜索是否应该和start交换的i也加1了。
  19. * 如处理{1,2,3}全排列
  20. * 相当于在处理完{2,3}的全排列后,
  21. * 我们回到上一层,start到了{1},此时需要考虑将{1} 和{2,3}里面交换。i就是去寻找2,3的
  22. *
  23. *
  24. * */
  25. if(start == a.length) {
  26. for(int i:a) {
  27. System.out.print(i);
  28. }
  29. System.out.println();
  30.  
  31. }
  32.  
  33. for(int i = start;i < a.length;i++) {
  34. if(isUnique(a,start,i)) {
  35. swap(a,start,i);
  36. bfs(a,start+1,i);
  37. /*
  38. * 为什么要再交换呢?
  39. * 你比如还是{1,2,3},我拿着{1}去交换{2,3}中间的{2},交换完成之后,
  40. * 显然成了{2} {1,3} 即2,1,3和2,3,1
  41. * 但是,我还要拿{1}去换{2,3}中的3啊,数组成了[2,1,3][2,3,1]我再拿第一个位置交换第三个位置显然乱套
  42. * 所以,我们恢复原样。当递归完成,回到上一层的时候,上一层的start,i还在哪给你记着呢,你本来换了哪个数
  43. * 原原本本给换回来。每一层都一样,所以不会乱。
  44. *
  45. *
  46. * */
  47. swap(a,start,i);
  48. }
  49.  
  50. }
  51. }
  52.  
  53. static boolean isUnique(int a[],int start,int end ) {
  54. /*
  55. * //如果在需要被交换的数a[end]之前出现了和它一样的数,例如{1}想要交换到{2,3,4}中的4没有问题,
  56. * 换完之后组成新的集合{2,3,1}进行递归,递归会处理好{2,3,1}的全排列
  57. * 但是如果{1}想要和{4,3,4}中的后面一个4进行交换就需要排除,因为当{1}和第一个4交换,已经将{1,3,4}的全排列
  58. * 结果全部给出了。
  59. * 因此,我们逐个检查a[end]这个元素之前,有没有和它 一样的数
  60. *
  61. *
  62. * */
  63. for(int i = start ;i < end; i++) {
  64. if(a[i] == a[end]) {
  65. return false;
  66. }
  67. }
  68. return true;
  69. }
  70.  
  71. public static void swap(int []a,int m,int n) {
  72. int t = a[m];
  73. a[m] = a[n];
  74. a[n] = t;
  75. }
  76.  
  77. }

  

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. 内存泄漏之malloc替换方法

    //内存泄漏之malloc替换方法 //内存泄漏之malloc替换方法#include "stdio.h"#include "stdlib.h" /*文件路径名 ...

  2. Websocket基础梳理

    Websocket原理: websocket介绍: WebSocket(http://dev.w3.org/html5/websockets)是HTML5规范(http://www.w3.org/TR ...

  3. Redis3.2学习记录

    nosql 特征:访问量大,高并发,高可用,海量数据 redis3.2作用:减轻关系型数据库查询的压力安装:windows下解压即可使用,启动服务如:redis-server redis-config ...

  4. 关于Linux操作系统中的一些易忘记的命令与作用

    1.改变文件或文件夹的权限,例如:chmod options mode file :[ugoa...] [+-=] [rwxXstugo],其中字符的含义如下: 第一组[ugoa...]:文件(夹)权 ...

  5. SpringCloud 教程 | 终章

    错过了这一篇,你可能再也学不会 Spring Cloud 了!Spring Boot做为下一代 web 框架,Spring Cloud 作为最新最火的微服务的翘楚,你还有什么理由拒绝.赶快上船吧,老船 ...

  6. 剪花布条 HDU - 2087(kmp,求不重叠匹配个数)

    Problem Description 一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input 输入 ...

  7. vue—组件基础了解

    什么是组件? 组件是vue中的一个可复用实例,所以new Vue()是vue中最大的那个组件,根组件,有名字,使用的时候以单标签或双标签使用 vm = newVue() 是最大的组件,具有很多实用性的 ...

  8. 【Python基础】11_Python中的字符串

    1.字符串的定义 可以使用""双引号,也可以使用''单引号定义字符串,一般使用双引号定义. 2.字符串的操作 判断类型: 查找和替换 大小写切换: 文本对齐 注:string.ce ...

  9. taskverse学习

    简介 taskverse是<linux二进制分析>一书作者编写的一个隐藏进程的检测工具,它使用/proc/kcore来访问内核内存,github的地址在这里:https://github. ...

  10. DateTime.TryParse 日期时间字符串验证

    DateTime applicationDatetime = new DateTime(); bool applicationDate = DateTime.TryParse("2019-0 ...