我对以下我的解决方案为何未给出正确答案感到困惑。我做了一些挖掘,我猜想这与呼叫的工作方式有关吗?我以为两种方式是相同的,但事实并非如此,但是我不完全了解我的错误返回的原因。这是我之前所做的研究: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])→true
split53([1,1,1])→假
split53([2,4,2])→true
我的回答:
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;
}
我的代码是否不返回上一个电话?如果是这样,我什么时候会使用一种返回另一种方法?如果已经有详尽的解释,请告诉我。我以为我了解堆栈和函数调用的工作原理,但是现在我担心自己朝着错误的方向前进。
[我认为,您的解决方案是扫描以num为单位存储的数字,并检查其是否可以被3或5整除或全都不除。
如果其被3整除,则将其添加到group3并移至下一个数字。如果它可以被5整除,则将其添加到group5并移至下一个数字。如果无法将其整除,请尝试将两者相加,然后针对每种情况检查是否使group3等于group5扫描所有数字后,请检查group3是否等于group5
public boolean split53Helper(int start, int [] nums, int group3, int group5){
if(start >= nums.length){
return group3 == group5;
}
if(nums[start] % 3 == 0 ){
/**
* In this case you dont have any choice as the number is divisble by 3.
* You should add the number to group3 and move on with next number.
*/
return split53Helper(start + 1, nums, group3 + nums[start], group5);
}
if(nums[start] % 5 == 0){
/**
* In this case you dont have any choice as the number is divisble by 5.
* You should add the number to group5 and move on with next number.
*/
return split53Helper(start + 1, nums, group3, group5 + nums[start]);
}
// Here you have choice, you can either put the number in group3 or group5
// It make sense to use if condition here rather than returning result directly
if(split53Helper(start+1, nums, group3 + nums[start], group5))
return true;
if(split53Helper(start+1, nums, group3, group5 + nums[start]))
return true;
return false;
}