【发布时间】:2020-02-26 07:22:51
【问题描述】:
我有点困惑为什么我下面的解决方案没有给出正确的答案。我做了一些挖掘,我猜这与通话的工作方式有关?我认为这两种方式都是一样的,但事实并非如此,但我不完全理解我的返回错误。这是我之前做的研究:https://softwareengineering.stackexchange.com/questions/333247/why-does-recursion-return-the-first-call-in-the-stack-and-not-the-last
问题:
给定一个整数数组,是否可以将整数分成两组,使两组的总和相同,并具有以下约束:所有为 5 的倍数的值必须在一组中,并且所有是 3 的倍数(而不是 5 的倍数)的值都必须在另一个中。 (不需要循环。)
例子:
split53([1, 1]) → 真
split53([1, 1, 1]) → 假
split53([2, 4, 2]) → 真
我的回答:
public boolean split53Helper(int start, int [] nums, int group3, int group5){
if(start >= nums.length){
return group3 == group5;
}
if(nums[start] % 3 == 0 ){
if (split53Helper(start + 1, nums, group3 + nums[start], group5)){
return true;
}
}
if(nums[start] % 5 == 0){
if (split53Helper(start + 1, nums, group3, group5 + nums[start])){
return true;
}
}
if(split53Helper(start+1, nums, group3 + nums[start], group5))
return true;
if(split53Helper(start+1, nums, group3, group5 + nums[start]))
return true;
return false;
}
正确的解决方案:
public boolean split53(int[] nums) {
return split53Helper(0, nums, 0, 0);
}
public boolean split53Helper(int start, int[] nums, int mult5, int mult3) {
if(start >= nums.length)
return mult5 == mult3;
if(nums[start] % 5 == 0)
return split53Helper(start+1, nums, mult5 + nums[start], mult3);
if(nums[start] % 3 == 0)
return split53Helper(start+1, nums, mult5, mult3 + nums[start]);
if(split53Helper(start+1, nums, mult5 + nums[start], mult3))
return true;
if(split53Helper(start+1, nums, mult5, mult3 + nums[start]))
return true;
return false;
}
我的代码没有返回最后一次调用吗? 如果是这样,我什么时候会使用一种方法来返回另一种方法?如果已经有详尽的解释,请告诉我。我以为我了解堆栈和函数调用是如何工作的,但现在我担心我正朝着错误的方向前进。
【问题讨论】:
-
split53试图解决什么问题? -
对不起,我添加了问题
标签: java recursion function-call