【发布时间】:2018-09-03 04:52:26
【问题描述】:
我如何使用递归编写一个 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
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 分钟:3 辅助:0 +++++++++++++ 最大:1 分钟:3 辅助:1 ++++++++++ 最大值:0 分钟:3 辅助:2 ++++++++++ 最大值:0 分钟:2 辅助:3
【问题讨论】:
-
您通常会从编写一个类并添加一个
main方法开始。您的具体问题是什么? -
public static void partition(int n, int max, String p) { if (n == 0) { System.out.println(p);返回; } for (int i = Math.min(max, n); i >= 1; i--) { partition(n-i, i, p+" "+i );我如何编辑分区函数以仅包含 3 个数字。它将递归划分以包括甚至 1+1+1+1+1 这不是必需的@Marvin
-
堆栈溢出不是免费的程序编写服务。尝试编写您的程序,如果您遇到困难,那么您可以来这里,发布您的代码,说明您遇到的确切问题并寻求帮助。假设这是编程课上的一个练习,你也可以向你的老师寻求帮助
标签: java loops for-loop recursion