【发布时间】:2021-05-02 15:02:20
【问题描述】:
我正在尝试编写一个递归方法,它接受一个正整数 num 参数并返回方程的解数
x1 + x2 + x3 = 数量
当三个 x 都是 1 到 10 之间的正整数时。 该方法还应该打印出这些解决方案,每个解决方案在单独的行中。打印顺序无关紧要。
我试过了:
public static int solutions (int x1, int x2, int x3, int counter, int num)
{
if(x1 > 10 || x2 > 10 || x3 > 10) {
return 0;
}
if (x1 + x2 + x3 == num) {
System.out.println(x1 + "+" + x2 + "+" + x3);
counter = 1;
} else {
return solutions (x1 + 1, x2, x3, counter, num) +
solutions (x1, x2 + 1, x3, counter, num) +
solutions (x1, x2, x3 + 1, counter, num);
}
return counter;
}
public static int solutions (int num)
{
if (num < 3 || num > 30) {
return 0;
}
return solutions (1, 1, 1, 0, num);
}
问题是我重复结果,问题是我得到重复结果,例如num = 5,我得到:
3 + 1 + 1
2 + 2 + 1
2 + 1 + 2
2 + 2 + 1
1 + 3 + 1
1 + 2 + 2
2 + 1 + 2
1 + 2 + 2
1 + 1 + 3
代替
1 + 1 + 3
1 + 2 + 2
1 + 3 + 1
2 + 1 + 2
2 + 2 + 1
3 + 1 + 1
如何避免重复两次?
【问题讨论】:
-
只打印
x1 <= x2 <= x3的解决方案。 -
请注意,您不必搜索
x3的所有值:从num - x1 - x2计算它,如果该值超出1..10 范围,则拒绝。 -
假设你有
foo(int a, int b){if (a<3 && b<3){ foo(a+1, b); foo(a, b+1); }。当您调用foo(1,1)时,它将在内部调用foo(2,1),然后是foo(1,2)。现在foo(2,1)将生成对foo(3,1); foo(2,2)的调用和foo(1,2)对foo(2,2); foo(1,3)的调用。如您所见,foo(2,2)被调用 两次。您需要决定哪些调用是不需要的。在什么情况下应该和不应该调用foo(2,2)。 -
这是开放大学作业中的一道题,Introduction to computer science using java course