排列递归

递归算法:

/**
	 * 求排列(递归)
	 * @param result 最终排列结果
	 * @param out    已经排列内容
	 * @param target 需要排列的数据集合
	 * @param m      排列元素个数
	 *
	 * 待解决:1 大数据 溢出 ()  2 使用多线程提速排列过程
	 *
	 * */
	public static void f(List<String> result, String out, List<String> target, int m) {
			if(m == 0) {
				result.add(out);
				System.out.println(out);
			} else {
				for (int i=0; i<target.size(); i++) {
					List<String> tem = getSubList(target,i);
					f(result, out + target.get(i), tem, m-1);
				}
			}
	}
	/**
	 * 求排除第i个元素的子集
	 * @param target
	 * @param i
	 * @return
	 */
	private static List<String> getSubList(List<String> target, int i) {
		List<String> temp = new ArrayList<String>();
		temp.addAll(target);
		temp.remove(i);
		return temp;
	}

调用:

public static void main(String[] args) {
		List<String> list = new ArrayList<String>();

		String[] arr = "1 2 3 4 5 6 7 8 9 0 A B C D E F G".split(" ");

		Collections.addAll(list, arr);

		List<String> result = new ArrayList<String>();

		int len = arr.length;
		int m = 17;
		long timer = System.currentTimeMillis();
		f(result, "", list, m);
		timer = System.currentTimeMillis() - timer;
		System.out.println("A("+m+","+len+") size="+result.size()+" timer="+timer);

	}
时间: 2024-11-13 09:31:53

排列递归的相关文章

算法竞赛入门经典_第七章 暴力求解法_7.2枚举排列:生成1~n的排列

版权所有,欢迎转载,转载请注明出处,谢谢 生成1~n的排列 递归思想:先输出所有以1开头的排列(这一步是递归调用),然后输出以2开头的排列(这一步是递归调用),接着是以3开头的排列······最后才是以n开头的排列. //vs2012测试代码 #include<iostream> using namespace std; void print_permutation(int n, int* A, int cur) { if(cur==n)//递归边界 { for(int i=0; i<n

具现化骨牌描述递归方法-递归判断

那么从之前随机生产的数据得到较多量[骨牌存储箱]的数据. 我们将利用这部分数据进行演示关于地递归的利用技巧. 以下注释较多.如果不喜欢的话可以不看,并不影响对递归方法的理解. 递归代码: 1 /* 2 1.首先: 3 假设情形:现在要利用现有的骨牌进行多米诺骨牌游戏. 4 2.拍列: 5 我们现在要知道第一骨牌推到的具体是那些(可多骨牌推到-多数据流同时进行就是码SQL的一大优势,所以小弟劝戒大家能不用游标就不用游标),之后往后面继续排序.排序可行的规则可以参照现实. 6 3.推牌: 7 我们根

python学习笔记第十一节(迭代和其他)

yiled 面相过程编程 造好内容,统一发给下面 上面这个是傻瓜版 内置函数 print(divmod(10,3)) 将10除以3,显示商和余数 enumerate函数,显示元素及它的索引,enumerate后面的都为迭代器 range 倒着取 切片的步长 四舍五入 保留3位小数 计算apple 10 3tesla 100000 1mac 3000 2lenovo 30000 3chicken 10 3这些商品列表的数量和价格的总价钱 上面是比较low的写法 上面这种是生成器表达式居然还有这种操

每日一小练——二项式系数加法解

上得厅堂,下得厨房,写得代码,翻得围墙,欢迎来到睿不可挡的每日一小练! 题目:二项式系数加法解 内容:请编写一个程序,仅仅用加法,求出n中取r个组合系数C(n,r),而且尽可能地使加法数目减少. 关于二项式:在数学里,二项式系数,或组合数,是定义为形如(1 + x)的二项式n次幂展开后x的系数(当中n为自然数,k为整数),通常记为.从定义可看出二项式系数的值为整数.这是来自百度的定义.我就不再赘余了. 关于二项式系数我们有一条性质使我们能够使用递归形式: C(n,r)=C(n,r-1)+C(n-

用递归写排列组合问题

最近递归弄的人头疼,但是这两天看过来也稍微总结了一些不能称得上是技巧的技巧吧 问题如下,将1,2,3,4这四个数字排列组合的输出来,看网上有个很二的方法吧,就是将10000以内的数全部输出再筛选,对此有点无语,但是程序倒是挺好编的,嘿嘿 回归到正题中,用递归的思想解决 (1)采用旋转数字的方法,当步长为1时,1234还是1234,步长为2的时候,1234可以变为1243.1324...,步长为3 的时候,1234可以变为1423,诸如此类,最重要的能体现递归的就是将每次递归一次的数字还可以接着旋

排列组合递归和非递归算法总结篇

#include <iostream> #include <string> #include <math.h> #include <vector> #include <algorithm> using namespace std; //method1 bool flag[5] ; int arr[5] = {1,2,3,4,5}; int len = sizeof(arr)/sizeof(int); void Comb(int n,int cou

这是递归和回溯的算法 是abcd&#39;的排列可能

#include<stdio.h>#include<iomanip>#include<iostream>using namespace std;bool b[10]={0};int a[10]={0};int print(){ for (int i=1;i<=4;i++) printf("%c ",a[i]); printf("\n");} int dosomething(int z){ int mm; for ( mm=1

【c语言】编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列。

/*编写一个函数reverse_string(char * string)(递归实现) 实现:将参数字符串中的字符反向排列. 要求:不能使用C函数库中的字符串操作函数.*/ #include <stdio.h> #include <assert.h> void reverse_string(char const * string) { assert( string != NULL ); if( *string != '\0' ) { string++; reverse_string

C++用非递归实现二叉树的前序排列,中序排列,后续排列

前序排列的非递归实现: Template<class T> Void PreOrder(BinaryTreeNode<T> *t) { stack <BinaryTreeNode<T> *> S(Maxlength); BinaryTreeNode<T> *p=t; do{ while(p){ visit(p);//访问P S.Add(p); p=p->LeftChild; } If(!S.IsEmpty()){ S.Delete(p);