让我们说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);
}
}
答案 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的值,它将无法运行。我建议稍微重构一下。