将数字n除以两个数字,使得两个数字之和为n

时间:2013-09-05 09:56:44

标签: java recursion partitioning

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

我希望看到我可以对此方法进行哪些改进,以提高效率。

3 个答案:

答案 0 :(得分:2)

我根本不会使用递归。每次递归调用都会占用堆栈上的额外空间,这是您真正不需要的。如果n很大,则可能会产生StackOverflowError。当然这取决于你的堆栈大小。在我的系统上,它抛出错误, n = 9998

只需使用简单的for循环即可。而且您不需要那些额外的方法参数 - xy,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,可以简化此代码。