标签:index Java 递归 队员 选择 return 数据结构 public
文章目录
递归求数的乘方
package recursion;
public class RecursionTest8 {
public static void main(String[] args) {
System.out.println(pow(2,5));
}
//用递归的算法实现求乘方,y不能是负数
public static int pow(int x, int y){
if(y == 0){//任何数的0次方是1
return 1;
}
if(y == 1){//边界条件,当y等于1时,不再进行递归
return x;
}
if(y%2==1){
//奇数
return pow(x*x,y/2)*x;
}else {
return pow(x*x,y/2);
}
}
}
递归解决组合问题
在数学中,组合是对事物的一种选择,而不考虑他们的顺序。
比如有5个登山队员,名称为 A,B,C,D和E。想要从这五个队员中选择三个队员去登峰, 这时候如何列出所有的队员组合。(不考虑顺序)。假设把从5个人中选出3个人的组合简写为(5,3), 规定 n 是这群人的大小,并且k是组队的大小。那么根据组合公式可以有: (n,k) = (n-1,k-1) + (n-1,k)
还是以递归的思想来解决:
- 首先这五个人的组合选择三个人分成两个部分,第一部分包含A队员,第二部分不包含A队员。对于从5个人中选择 3 个人,有: (5,3) = (4,2)+(4,3) 。
- (4,2)表示已经有A队员了,然后从剩下的4个队员中选择2个队员,(4,3)表示从5个人中剔除A队员,从剩下的4个队员中选择3个队员,这两种情况相加就是从5个队员中选择3个队员。
- 现在已经把一个大问题转换为两个小问题了。从4个人的人群中做两次选择(一次选择2 个,一次选择3个),而不是从5个人的人群中选择3个。
- 从4个人的人群中选择2个人,又可以表示为:(4,2) = (3,1) + (3,2)。从4个人的人群中选择3个人,又可以表示为:(4,3) = (3,2) + (3,3)。以此类推,很容易想到递归的思想。
package recursion;
public class RecursionTest10 {
public static void main(String[] args) {
char[] arr = new char[]{'A','B','C','D','E'};
Comb comb = new Comb(arr);
comb.doComb(3,0);
}
}
class Comb{
private char[] persons;// A B C D E
private boolean[] selects;//选中的标记
public Comb(char[] data){
this.persons = data;
selects = new boolean[data.length];
}
//具体实现组合的递归方法
public void doComb(int selectNum,int index){
//选多少人,从第几个人开始到最后的人中选
//就是从index到最后的几个人中选择selectNum个人
//边界
if(selectNum == 0){
//如果选0个人,那就没必要再分了,直接结束
for (int i=0;i<selects.length;i++){
if (selects[i]){
System.out.print(persons[i]+" ");
}
}
System.out.println();
return;
}
if(index >= persons.length){
//所有的组合都考虑完了
return;
}
//递归
//选择当前元素
selects[index] = true;
doComb(selectNum-1,index+1);
//不选择当前元素
selects[index] = false;
doComb(selectNum,index+1);
}
}
标签:index,Java,递归,队员,选择,return,数据结构,public 来源: https://blog.csdn.net/Mr_Wanderer/article/details/113853393
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。