Java 编码53;对正确使用退货的方式感到困惑
我有点困惑,为什么我下面的解决方案没有给出正确的答案。我做了一些调查,我猜这和电话的工作方式有关?我认为这两种方法都是一样的,但事实并非如此,但我并不完全理解我的方法返回的是错误的。这是我之前做的研究: 问题: 给定一个整数数组,是否可以将整数分成两个组,以便两个组的总和相同,但有以下限制:所有5的倍数的值必须在一个组中,所有3的倍数(而不是5的倍数)的值必须在另一个组中。(不需要循环。) 例如: 拆分53([1,1])→ 真的 拆分53([1,1,1])→ 假的 拆分53([2,4,2])→ 真的 我的答覆是:Java 编码53;对正确使用退货的方式感到困惑,java,recursion,function-call,Java,Recursion,Function Call,我有点困惑,为什么我下面的解决方案没有给出正确的答案。我做了一些调查,我猜这和电话的工作方式有关?我认为这两种方法都是一样的,但事实并非如此,但我并不完全理解我的方法返回的是错误的。这是我之前做的研究: 问题: 给定一个整数数组,是否可以将整数分成两个组,以便两个组的总和相同,但有以下限制:所有5的倍数的值必须在一个组中,所有3的倍数(而不是5的倍数)的值必须在另一个组中。(不需要循环。) 例如: 拆分53([1,1])→ 真的 拆分53([1,1,1])→ 假的 拆分53([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;
}
我的代码没有返回最后一个呼叫吗?
如果是这样,我什么时候会使用一种返回方法而不是另一种?如果已经有详细的解释,请告诉我。我原以为我了解堆栈和函数调用是如何工作的,但现在我担心我走错了方向 请查看以下正确解决方案的说明。
我认为,解决方案是扫描存储在NUM中的数字,并检查其是否可被3或5整除,或者不可整除 如果它可以被3整除,则将其添加到第3组,然后继续下一个数字。
如果它可以被5整除,则将其添加到第5组,并继续下一个数字。
若它不能被“无”整除,你们可以尝试将二者相加,然后继续下一个数字 扫描完所有数字后,检查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.
* Dont put the below statement in if condition
*/
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.
* Dont put the below statement in if condition
*/
return split53Helper(start + 1, nums, group3, group5 + nums[start]);
}
// Here you have choice, you can either put the number in group3 or group5
if(split53Helper(start+1, nums, group3 + nums[start], group5))
return true;
if(split53Helper(start+1, nums, group3, group5 + nums[start]))
return true;
return false;
}
请查看以下正确解决方案的说明。
我认为,解决方案是扫描存储在NUM中的数字,并检查其是否可被3或5整除,或者不可整除 如果它可以被3整除,则将其添加到第3组,然后继续下一个数字。
如果它可以被5整除,则将其添加到第5组,并继续下一个数字。
若它不能被“无”整除,你们可以尝试将二者相加,然后继续下一个数字 扫描完所有数字后,检查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.
* Dont put the below statement in if condition
*/
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.
* Dont put the below statement in if condition
*/
return split53Helper(start + 1, nums, group3, group5 + nums[start]);
}
// Here you have choice, you can either put the number in group3 or group5
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 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;
} else {
return false; // <-------
}
}
if(nums[start] % 5 == 0){
if (split53Helper(start + 1, nums, group3, group5 + nums[start])){
return true;
} else {
return false; // <-------
}
}
if(split53Helper(start+1, nums, group3 + nums[start], group5))
return true;
if(split53Helper(start+1, nums, group3, group5 + nums[start]))
return true;
return false;
}
如果这个问题的答案是“否”,那么你不应该问“如果我把它放在5的组里会怎么样?”(我指的是你答案中的第四个递归调用)
你不能把它放在5的组中,因为已知元素可以被3整除
这就是为什么当你知道它可以被3整除时,你应该立即返回,而其余的不能被分成组。以下是正确的解决方案,重新编写后看起来更像你的答案:
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;
} else {
return false; // <-------
}
}
if(nums[start] % 5 == 0){
if (split53Helper(start + 1, nums, group3, group5 + nums[start])){
return true;
} else {
return false; // <-------
}
}
if(split53Helper(start+1, nums, group3 + nums[start], group5))
return true;
if(split53Helper(start+1, nums, group3, group5 + nums[start]))
return true;
return false;
}
如果这个问题的答案是“否”,那么你不应该问“如果我把它放在5的组里会怎么样?”(我指的是你答案中的第四个递归调用)
你不能把它放在5的组中,因为已知元素可以被3整除
这就是为什么当你知道它可以被3整除时,你应该立即返回,而其余的不能被分成组。什么问题是
split53
试图解决?抱歉,我添加了问题split53
试图解决什么问题?抱歉,我添加了问题