gpt4 book ai didi

java - CodingBat Java 递归 轻微概念错误

转载 作者:行者123 更新时间:2023-11-30 04:12:06 25 4
gpt4 key购买 nike

问题是“给定一个 int 数组,是否可以将 int 分为两组,使得一组的和是 10 的倍数,另一组的和是奇数。每个 int 都必须属于一组或另一组。编写一个递归辅助方法,该方法接受您喜欢的任何参数,并从 splitOdd10() 对递归辅助方法进行初始调用。(不需要循环。)“

我在下面有一个正确的解决方案,但我所有的返回值都与正确的相反。修复它的黑客方法只是在最后切换 boolean 值,但我想知道我在概念上犯了什么错误。

public  boolean splitOdd10(int[] nums) { 
if (nums.length==0) return false;

//Should not have the ! operator
return (!splitOdd10(nums,0,1));

}
public Boolean splitOdd10(int[] nums, int lowerBound,int upperBound) {
int split10Sum=getSum(nums,lowerBound,upperBound);
int splitOddSum=getSum(nums)-split10Sum;
if (split10Sum % 10 == 0 && splitOddSum % 2 == 0) return true;

if (upperBound < nums.length) {
if (splitOdd10(nums,lowerBound,upperBound+1)) return true;
if (splitOdd10(nums,lowerBound+1,upperBound+1)) return true;
}
if (lowerBound < upperBound)
if (splitOdd10(nums,lowerBound+1,upperBound)) return true;
return false;
}


public int getSum(int[] nums) {
return getSum(nums,0,nums.length);
}
public int getSum(int[] nums, int lowerBound, int upperBound) {
if (lowerBound == upperBound) return 0;
return nums[lowerBound]+getSum(nums,lowerBound+1,upperBound);
}

最佳答案

在回答中需要注意两件事:

  1. splitOdd10(new int[] {10, 1, 10, }) 将返回 false,而不是 true。
  2. 如果当前分组的 10Sum 可被 10 整除,则您的 splitOdd10(int[] nums, int lowerBound,int upperBound) 方法将返回 true,并且 rest 能被二整除,也就是说它是偶数,而不是奇数。
具体来说。对于第二点:

if (split10Sum % 10 == 0 && splitOddSum % 2 == 0)   return true;

应该是

if (split10Sum % 10 == 0 && splitOddSum % 2 == 1)   return true;

第一点可能没问题,具体取决于您要解决的问题,也就是说,如果您需要将数组“拆分”为两部分,那么它会起作用,但可能会给出太多误报。具体来说,您需要考虑以下数组的答案应该是什么:

[10, 10, 1]
[1, 10, 10]
[1, 10, 2]
[1, 2, 10]
[10, 1, 10]
[10, 1, 2]

关于java - CodingBat Java 递归 轻微概念错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19367674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com