全排列_蓝桥杯问题+一点对递归的看法

给定N个不同字符,将这N个字符全排列,最终的结果将会是N!

如:给定 ABC三个不同的字符,则结果为:ABCACBBACBCACABCBA一共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的元素全部转移给result
		if(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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值