遇到一个算法题目,是求在n个数字中取m个数字(有序),有多少种可能。我一看,这么简单,就是A(n,m)呀。但是自己动手写代码的时候却发现好难实现,这就是所谓眼高手低吧,网上查了一下,把自己的理解记下来吧,方便以后回顾:
package sky_100;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
public class Permutations {
static int sum = 0;
public static void main(String[] args) {
Permutations per = new Permutations();
String[] str = {"1","2","3","4"};
int total = 2;
List<String> list = Arrays.asList(str);
per.recursive("", total, list);
System.out.println("总数为:"+sum);
}
/**
*
* @param prefix 拼接结果前缀
* @param total 需要从N个数中取total个数
* @param list 含有N个数的集合
*/
public void recursive(String prefix,int total, List<String> list) {
//总的要循环多少次
for(int i=0;i<list.size();i++){
LinkedList<String> tempList = new LinkedList<String>(list);//复制一份list,不能对原list进行操作
String remove = tempList.remove(i);//从集合中移出某个元素,防止出现重复数字
String s = prefix+remove;//拼接结果
if(total == 1){//当从N个数中取1个数时
System.out.println(s);//直接输出结果
sum++;
}else{
int temp = total-1;//每到这里就得减一层
recursive(s, temp, tempList);//这里所传的值都是新值
}
}
}
/**
* 理解递归:以total为2,str={"1","2","3","4"}为例,
* 第一次递归有一个for循环,然后这个for循环又套一层for循环
* for(i=0;i<4;i++){
* //因为集合中被移除一个数
* for(i=0;i<3;i++){
* ...
* }
* }
*/
}