【问题标题】:CodingBat Java Recursion Slight Conceptual MistakeCodingBat Java 递归 轻微的概念错误
【发布时间】:2013-10-14 19:22:12
【问题描述】:

问题是“给定一个整数数组,是否可以将整数分成两组,使得一组的和是 10 的倍数,而另一组的和是奇数。每个 int 必须在一组或另一组中。编写一个递归帮助器方法,它接受你喜欢的任何参数,并从 splitOdd10() 对你的递归帮助器进行初始调用。(不需要循环。)“

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

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);
}

【问题讨论】:

    标签: java recursion


    【解决方案1】:

    回答中需要注意两点:

    1. splitOdd10(new int[] {10, 1, 10, }) 将返回 false,而不是 true。
    2. 如果当前分组具有可被十整除的10Sum 和可被二整除的rest,则splitOdd10(int[] nums, int lowerBound,int upperBound) 方法返回true,即如果它是偶数,而不是奇数。

    具体来说。第二点:

    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]
    

    【讨论】:

    • 谢谢!我完全发疯了,认为奇怪的是 % 2 ==0。
    • @GeeWay 它发生了! ;-) 如果这有助于您解决问题,您可能需要考虑接受答案。
    猜你喜欢
    • 1970-01-01
    • 2015-03-01
    • 1970-01-01
    • 2016-07-17
    • 2018-06-21
    • 1970-01-01
    • 2019-11-06
    • 1970-01-01
    相关资源
    最近更新 更多