/**
* 组合算法:
* 递归
* m个物体取n个的组合(m>=n,n>1)
* 根据前2个数相邻,或者相隔v个数组合n个数
*/
public class ZH {
int arr[]=new int[]{2,3,6,5,4};//长度为5的数组取3个组合共5*4*3/3/2=10种(没有排列)
int n=3;//n>=2
int m=arr.length;
public static void main(String[] args) {
ZH z=new ZH();
z.combothersame(0,0);//间隔0
z.combothersame(0,1);//间隔1
z.combothersame(0,2);//间隔2
}
//相邻
void comb(int i){
if(i>m){
return;
}
int j=i+n-1;
while(j<m){
for(int k=i,t=1;k<=m-n+1;t++){
if(t==n){
break;
}
System.out.print(arr[k++]);
}
System.out.print(arr[j]);
System.out.println();
j++;
}
comb(i+1);
}
/*(1)
236
235
234
365
364
//654
*/
//不相邻:间隔v
void combotherv(int v){
int i=0;
if(v+n>m){
return;
}
int j=i+n-1+v;
while(j<m){
for(int k=i,t=1;k<=m-n+1;t++){
if(t==n){
break;
}
System.out.print(arr[k]);
k=k+1+v;
}
System.out.print(arr[j]);
System.out.println();
j++;
}
combotherv(v+1);
}
//相邻 和不相邻:间隔v
void combothersame(int i,int v){
if(v+n>m||i>m){
return;
}
int j=i+n-1+v;
while(j<m){
for(int k=i,t=1;k<=m-n+1;t++){
if(t==n){
break;
}
System.out.print(arr[k]);
k=k+1+v;
}
System.out.print(arr[j]);
System.out.println();
j++;
}
if(v==0){
combothersame(i+1,0);//前两个数间隔0
}
else{
combothersame(i+1,v);//间隔大 于或等于1
}
}
}
相关推荐
组合的递归算法(递归求*组合*),很简洁。
- **回溯法**:在解决组合优化问题,如八皇后问题、N皇后问题、迷宫问题时,递归结合回溯可以找出所有可能的解决方案。 递归算法在使用时需要注意几个关键点: - **效率**:递归可能导致大量的函数调用,增加内存...
组合递归算法是一种在计算机科学中广泛使用的算法设计策略,它结合了递归的思想和组合的概念。递归是指一个函数或过程在其定义中调用自身,而组合则是指将小问题的解决方案组合起来以解决大问题。在本案例中,我们...
标题“经典算法之递归”暗示我们将探讨使用递归解决一些经典的计算机科学算法。递归通常涉及两个主要部分:基本情况(Base Case)和递归情况(Recursive Case)。基本情况是问题最简单或最小的形式,可以直接求解,...
在计算机科学中,组合问题是一种常见的算法问题,它涉及到从给定的一组元素中选择特定数量的元素,而不需要考虑元素的顺序。本主题将详细探讨如何从N个不同的元素中选择M个元素的所有可能组合,同时提供递归和非递归...
9. **递归的应用**:在ACM竞赛中,递归算法广泛应用于图论(如深度优先搜索)、树结构处理(如二叉树遍历)和组合数学等领域。 10. **注意事项**:递归可能导致栈溢出,尤其是在没有正确设置终止条件或者问题规模过...
排列组合是常见的数学问题,本文就以完整实例形式讲述了C#实现排列组合算法的方法。分享给大家供大家参考之用。具体方法如下: 首先,数学中排列组合,可表示为:排列P(N,R) 其实排列实现了,组合也就实现了,组合...
在IT领域,算法是解决问题的核心工具,而递归与分治策略、动态规划、贪心算法、回溯法、分支限界法以及随机化算法都是其中的重要组成部分。这些算法不仅适用于计算机科学,也在数据结构、优化问题和复杂计算中扮演着...
总的来说,合并排序算法非递归形式的实现是一个很好的学习案例,它涉及到计算机科学中的基础概念,如分治策略、数据结构和算法效率。通过深入研究`mergeSort.c`,你不仅可以提升编程技能,还能增强对算法设计和分析...
在IT领域,算法是解决问题的核心工具,而递归思想是其中一种重要的思维方式。本文将深入探讨基础算法、递归思想以及阶乘算法,同时我们还会看到如何使用C语言来实现这些概念。 首先,基础算法是计算机科学的基础,...
在【标题】"学习常用算法之(5)递归法"和【描述】中,递归被解释为一种像故事中老和尚讲故事一样自我包含和无限延续的概念。 在【部分内容】中,以小猴吃枣为例,展示了如何通过递归来解决问题。小猴每天吃掉前一天...
### 组合算法与递归实现 #### 组合算法简介 组合算法的目标是从n个不同元素中选择k个元素的所有可能组合。例如,从1到10这10个数字中选择3个数字的所有组合方式。组合算法的应用场景非常广泛,如概率计算、密码学...
3. 位运算的理解:在组合算法中,位运算的运用可以显著提升算法性能,你需要熟悉位运算符及其在Java中的使用。 4. 缓存优化:对于组合问题,可以考虑使用缓存存储已计算的结果,避免重复计算。 总之,这个资源包...
分治策略是递归的一种典型应用,它将问题分解为相互独立且与原问题结构相同的子问题,然后分别解决子问题,最后将子问题的解组合成原问题的解。 **寻找第k小元素** 寻找一个数组中的第k小元素可以使用分治策略。一...
基于C语言排列组合算法 排列组合是计算机科学中一个重要的概念,它广泛应用于数学、统计学、计算机科学等领域。排列组合问题的算法设计是指如何高效地生成所有可能的排列或组合。今天,我们将讨论基于C语言的排列...
2. **定义递归规则**:如何将大问题分解为小问题,并通过这些小问题的解决方案组合成大问题的解决方案。 3. **分析递归深度**:递归调用的次数决定了递归的深度,这直接影响到程序的效率和内存消耗。 **递归与非...
在合并排序中,我们首先将数组分为两半,然后对每一半分别进行排序(这是递归调用),最后将两个有序的子数组合并成一个大的有序数组。递归公式大致是这样的:如果数组长度为1,则已排序;否则,将数组分为两半,...
在解决数列问题时,递归函数的执行流程是从大问题逐步分解为小问题,直至达到递归基,然后逐层返回结果,组合成最终答案。例如,求解阶乘`f(5)`时,会依次计算`f(4)`,`f(3)`,直到`f(1)`,然后逐步返回结果。 除了...