全排列_蓝桥杯问题+一点对递归的看法
来源:互联网 发布:网络教育考公务员 编辑:程序博客网 时间:2024/06/05 10:27
给定N个不同字符,将这N个字符全排列,最终的结果将会是N!种。
如:给定 A、B、C三个不同的字符,则结果为:ABC、ACB、BAC、BCA、CAB、CBA一共3!=3*2=6种情况。
通过本题进一步学习了Vector的应用,更深入了解了递归、循环的使用环境。
下面看代码
import java.util.*;public class Main1 {public static int count;public static void f(Vector<Character> sourse,Vector<Character> result){//当 sourse的元素全部转移给resultif(sourse.size()==0){for(int i=0;i<result.size();i++){//打印此时的排列System.out.print(result.elementAt(i));}System.out.println();count++;return;}for(int i=0; i<sourse.size(); i++){//循环中套递归,确保size() * size()的全排列//给目标赋值 sourse[i] --add--> result[]result.add(sourse.elementAt(i));//result将sourse的i元素放到自己尾部sourse.remove(i);//sourse针对第i个元素操作f(sourse,result);//这里的递归其实就相当于从头到尾的一次循环//不要忘记回溯sourse.add(i,result.elementAt(result.size()-1));result.remove(result.size()-1);}}public static void main (String[] args) { Scanner scan = new Scanner(System.in); int n = scan.nextInt(); //声明sourse,result两个Vector型对象数组,对象为Character,字符型 Vector<Character> sourse = new Vector<Character>(); Vector<Character> result = new Vector<Character>(); //初始化sourse for(int i=0;i<n;i++){ sourse.add((char)(i+'A')); } //调用递归方法 f(sourse,result); //最后打印全排列的个数 System.out.println(count); }}
代码中的递归部分使用了回溯,通过同网上相似代码的学习发现,其实可以不用试探+回溯的这种方法,可以直接再定义个参数,递归的时候作为形参层层传下去即可。
但是这种方法实际上不如回溯的方法更省内存,要知道,每一次声明一个Vector变量就占用了一部分空间,使用回溯的方法可以节约这些内存,但也会容易逻辑搞错,特别是对于Vector的对象数组,容易操作出错。
细想,递归不就是一层层的向下循环,每层的形参都在方法体中转化为实参,这样看来,递归的方法比简单的for循环所占用的资源多多了。所以,能用一个for表示的最好还是不要小题大做使用递归。下面是没有使用试探+回溯的代码部分。
for (int i = 0; i < sourse.size(); i++) {Vector<Character>sourse1=new Vector<Character>(sourse);Vector<Character>result1=new Vector<Character>(result);result1.add(sourse.elementAt(i));sourse1.remove(i);f(sourse1, result1);}
1 0
- 全排列_蓝桥杯问题+一点对递归的看法
- C递归_全排列问题 & 异或^的陷阱
- 递归 全排列 问题
- 递归8_全排列
- 全排列问题的递归、STL实现
- 13_栈的递归实例4---全排列
- 对SharePoint的一点看法
- 对需求的一点看法
- 对c++的一点看法
- 对程序员的一点看法!
- 对Java的一点看法
- 对ACM的一点看法。
- 对教育的一点看法
- 对模式的一点看法
- 对SpringMVC的一点看法
- 对全排列问题的思考
- 全排列问题 递归实现
- 递归求解全排列问题
- UITableView reuse机制
- 【进阶篇】Android学习笔记——TextInputLayout
- java最简单方法配置统一异常页面
- Volley 的介绍和使用(一)
- Delphi 三层框架开发客户端开发
- 全排列_蓝桥杯问题+一点对递归的看法
- C++使用模板并隐藏实现
- HTML5新控件 - 日期和时间选择输入
- KVC中setValuesForKeysWithDictionary 崩溃问题
- Android 开关机动画
- ShareSDK For IOS
- 细数iOS上那些你绝对不会注意到的神细节
- caffe代码阅读5:Layer的实现细节-2016.3.17
- apache tomcat 集群