Java 使用递归进行循环
如何使用递归编写一个java程序,该程序计算所有可能的组合,包括从0到3的任意3个数字,并将总和设为5。允许重复 答案应该像这样打印所有排列Java 使用递归进行循环,java,loops,for-loop,recursion,Java,Loops,For Loop,Recursion,如何使用递归编写一个java程序,该程序计算所有可能的组合,包括从0到3的任意3个数字,并将总和设为5。允许重复 答案应该像这样打印所有排列 3 + 2 + 0 3 + 1 + 1 3 + 0 + 2 2 + 2 + 1 2 + 1 + 2 2 + 0 + 3 1 + 3 + 1
3 + 2 + 0
3 + 1 + 1
3 + 0 + 2
2 + 2 + 1
2 + 1 + 2
2 + 0 + 3
1 + 3 + 1
1 + 2 + 2
1 + 1 + 3
我试过写一个函数,但我认为它效率低下。有谁能告诉我,在没有这么多ifs的情况下,我如何优化它以获得更好的执行时间
public class Combinations
{
static int aux = 0;
static int temp;
static void findCombinations(int sum, int max,int min)
{
if(max <= 2)
{
if(max <= 0)
{
if(aux >= 3)
{
System.out.println("max: "+max);
System.out.println("min: "+min);
System.out.println("Aux:"+aux);
System.out.println("-----------");
return;
}
else
{
System.out.println("max: "+max);
System.out.println("min: "+min);
System.out.println("Aux:"+aux);
System.out.println("-----------");
aux = aux + 1;
min = min - 1;
findCombinations(sum, max, min);
}
}
else
{
System.out.println("max: "+max);
System.out.println("min: "+min);
System.out.println("Aux:"+aux);
System.out.println("-----------");
aux = aux + 1;
max = max - 1;
findCombinations(sum, max, min);
}
}
else
{
System.out.println("max: "+max);
System.out.println("min: "+min);
System.out.println("Aux:"+aux);
System.out.println("-----------");
max = max - 1;
min = min + 1;
findCombinations(sum, max, min);
}
}
//Driver code
public static void main(String a[])
{
int n = 5;
int max_bound = 3;
int min_for_sum = n - max_bound;
findCombinations(n,max_bound,min_for_sum);
}
}
下面给出了代码的输出
最高:3
最小:2
辅助:0
+++++++++
最高:2
min:3
辅助:0
+++++++++++
最高:1
min:3
辅助:1
++++++++++
最高:0
min:3
辅助:2
++++++++++
最高:0
最小:2
Aux:3这是你的家庭作业,我只做了一个基本代码,我没有尝试编译它,这只是为了一般的指导,我也没有添加0,但你明白了:
public static void main(String []args){
print(0, new int[3])
}
static void print(int num, int[] current){
if(num == 3){
if((current[0] + current[1] + current[2]) ==5) print (current);
return;
}
int[] with1 = new int[3];
int[] with2 = new int[3];
int[] with3 = new int[3];
with1[num] = 1;
with2[num] = 2;
with3[num] = 3;
//copy the start of the current array to each new array here
num++
print(num,with1);
print(num,with2);
print(num,with3);
}
我不确定这是否是一个推荐的方法,但你可以得到结果 公开课考试{ 公共静态字符串参数[]{
int count = 0;
for(int i=0; i<=3; i++){
for(int j=0; j<=3; j++){
for(int k=0; k<=3; k++){
if((i+j+k) == 5){
System.out.println("i="+i+","+"j="+j+","+"k="+k);
count++;
}
}
}
}
System.out.println("count = "+count);
}
}从一个简单的解决方案开始,下面介绍如何将3个嵌套循环解决方案减少为2个嵌套循环 通过调用sumUp3进行测试; 输出: [0,2,3]之和为5 [0,3,2]之和为5 [1,1,3]之和是5 [1,2,2]之和是5 [1,3,1]之和是5 [2,0,3]之和是5 [2,1,2]之和是5 [2,2,1]之和是5 [2,3,0]之和是5 [3,0,2]之和为5 [3,1,1]之和是5 [3,2,0]之和是5
您通常从编写一个类和添加一个main方法开始。您的具体问题是什么?公共静态void partitionint n,int max,String p{if n==0{System.out.printlnp;return;}for int i=Math.minmax,n;i>=1;i-{partitionn-i,i,p++i;} }如何编辑分区函数,使其仅包含3个数字。它将递归地进行除法,甚至包括1+1+1+1+1,这是不需要的@MarvinStack overflow不是免费的程序编写服务。请尝试编写您的程序,如果遇到问题,您可以来这里发布代码,说明您遇到的确切问题并寻求帮助。Assum这是编程课上的一个练习,你也可以向你的老师寻求帮助。像这样的三个嵌套for循环很少是做某事的推荐方法,而且可能是一个糟糕的解决方案。但是当你这样回答时,你应该展开:为什么它有效?你的思维过程是什么?对于可能来到这里的其他人,应该是generic,这样他们就可以很容易地根据自己的需要对其进行调整。此外,请确保文本和代码之间有一个额外的行,以便所有代码都按此格式进行格式化。第二个循环forint j=0;jI以一种非常低效的方式使用了递归。您能建议我可以进行哪些更改以使其有效吗。
private static void sumUp(int max) {
sumUp(max, 0,0);
}
private static void sumUp(int maxValue, int k, int counter ) {
for (int i = 0; i<= maxValue ; i++ ) {
for (int j = 0; j<= maxValue ; j++ ) {
if((i+j+k) ==5) {
System.out.println(i+"+"+j+"+"+k+" = " +(i+j+k));
}
counter++;
}
}
k++;
if(k > maxValue) { return; }
sumUp( maxValue, k, counter);
}
static void sumUp (int max) {
sumUp(new int[] {0,0,0}, max, 0);
}
static void sumUp ( int[] start, int max, int index ) {
for(int i= start[index] ; i<= max; i += 1) {
start[index] = i;
if(index < (start.length-1)) {
int keep = start[index+1];
sumUp(start, max, index+1 );
start[index+1] = keep;
} else {
if(IntStream.of(start).sum() == 5) {
System.out.println("Sum of "+Arrays.toString(start)+" is 5");
}
}
}
}