0

例如,如果 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);

我想看看我可以对这种方法进行哪些改进以使其更有效。

4

3 回答 3

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);
    }
于 2013-09-05T10:00:23.820 回答
1

试试这个

int num=4;
    for(int i=0;i<=num;i++){
        System.out.println("["+i+","+(num-i)+"]");
    }
于 2013-09-05T10:00:51.030 回答
0

好吧,如果你必须使用递归,那么例如你根本不需要 y 参数,因为你可以通过从 n 中减去 x 来得到它,y = nx。并且您可以在 x <= nx 时停止递归,以免出现重复值,例如 [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,可以进一步简化此代码。

于 2013-09-05T10:09:30.700 回答