例如,如果n为4,则n1 + n2 = 4.n,n1,n2> = 0
输出应为
[4, 0] [0, 4] [1, 3] [2, 2] [3, 1]
我试过了。
public static void partition(int n, int x, int y) throws Exception{
int n1, n2;
n1 = x;
n2 = y;
System.out.println(n1 + " : " + n2);
x = x - 1;
y = y + 1;
if ( x >= 0) {
TestMethods.partition(n, x, y);
} else {
return;
}
}
我将上述方法称为TestMethods.partition(4,4,0);
我希望看到我可以对此方法进行哪些改进,以提高效率。
答案 0 :(得分:2)
我根本不会使用递归。每次递归调用都会占用堆栈上的额外空间,这是您真正不需要的。如果n
很大,则可能会产生StackOverflowError
。当然这取决于你的堆栈大小。在我的系统上,它抛出错误, n = 9998 。
只需使用简单的for
循环即可。而且您不需要那些额外的方法参数 - x
和y
,IMO。
public static void partition(int n) {
for (int i = n; i >= 0; --i) {
System.out.printf("[%d, %d] ", i, n - i);
}
}
只需使用它调用 - TestMethods.partition(4);
请注意,您可以通过在同一次迭代中打印对称输出来保存迭代次数。这会将迭代次数减少到一半:
for (int i = 0; i <= (n + 1) / 2; ++i) {
System.out.printf("[%d, %d] [%d, %d] ", i, n - i, n - i, i);
}
答案 1 :(得分:1)
试试这个
int num=4;
for(int i=0;i<=num;i++){
System.out.println("["+i+","+(num-i)+"]");
}
答案 2 :(得分:0)
好吧,如果必须使用recurtion,那么你根本就不需要y参数,因为你可以通过从n减去x来获得它,y = n-x。你可以在x&lt; = n-x时停止递归,以便不具有像[3,1]和[1,3]
这样的重复值public static void partition(int n, int x) throws Exception{
int n1, n2;
n1 = x; n2 = n - x;
System.out.println(n1 + " : " + n2);
if ( n1 - 1 >= n2 + 1) {
TestMethods.partition(n, n1 - 1);
} else {
return;
}
}
此外,通过删除临时变量n1,n2,可以简化此代码。