使用递归java的数字总和

时间:2016-01-18 19:39:08

标签: java recursion

让我们说n = 4。随着递归,我想返回:

1 1 1 1
1 1 2
1 3
2 1 1
2 2
3 1
4

基本上我想取数字n并通过合并数字1,2,3和4,在sum == n的数量时创建所有可能的变体。

这是我的第一个想法,但它给了我

  

线程中的异常" main" java.lang.StackOverflowError的

public static void test_2(String path, int sum, int n){
    if(sum == n){
        System.out.println(path);
    } else {
        test_2(path+"1 ", sum + 1, n);
        test_2(path+"2 ", sum + 2, n);
        test_2(path+"3 ", sum + 1, n);
        test_2(path+"4 ", sum + 2, n);
    }
}

1 个答案:

答案 0 :(得分:5)

主要问题是你总是在sum != n时递归。当总和大于n时,你永远不会停止,因此StackOverflowError这意味着我们需要添加一个检查并在总和变大时终止:

public static void test_2(String path, int sum, int n) {
    if (sum == n) {
        System.out.println(path);
    } else if (sum < n) { // <-- only recurse if the sum is less than the target
        test_2(path+"1 ", sum + 1, n);
        test_2(path+"2 ", sum + 2, n);
        test_2(path+"3 ", sum + 3, n);
        test_2(path+"4 ", sum + 4, n);
    }
}

作为旁注,在你的最后两个电话中,你写了1和2而不是3和4,但那可能只是一个错字。

来自test_2("", 0, 4)的输出:

1 1 1 1 
1 1 2 
1 2 1 
1 3 
2 1 1 
2 2 
3 1 
4 

但请注意,您当前的代码不是非常动态:如果您为n提供大于4的值,它将无法运行。我建议稍微重构一下。