【问题标题】:How to check that all values are equal in array using recursion?如何使用递归检查数组中的所有值是否相等?
【发布时间】:2015-08-24 13:59:36
【问题描述】:

我正在尝试递归地解决这个算法;我想检查数组中的所有值是否相同(或彼此相等)。如果所有值都相等,则返回 true,如果不相等,则返回 false。我的代码没有通过任何测试。

public boolean allEqual(int[] a, int start, int end){
    if (start > end) return false;
    if (a.length==0) return false;
    if (start==end && a[start] == a[end]) return true;
    if (a[start] != a[end]){
        return false;
    }
    return allEqual(a, start++, end);
} 

【问题讨论】:

  • 你能举个例子,算法返回错误的结果吗?
  • 请向我们提供一个测试用例、一个示例输入数组和预期的输出。 (我们在使用多维数组吗?这是 javascript 还是 java?
  • 如果你想要一个测试它肯定不会通过(即使在 Eran 修复之后),尝试一个巨大的数组。
  • 递归执行此操作没有任何借口(理由) - 它的效率非常低,并且会导致大型数组上的堆栈溢出。另外,通过与数组中的最后一个元素进行比较,您会故意读取不连续的内存块,这本身会减慢您的程序速度。请不要将其用于“真实”代码!

标签: java arrays optimization recursion


【解决方案1】:

改变

return allEqual(a, start++, end);

return allEqual(a, start+1, end);

start++start 的原始值传递给递归调用(这是后自增运算符返回的值),因此您的递归将永远不会结束,您可能会得到一个 StackOverflowError

【讨论】:

  • 另一种可能的解决方案是使用++start 而不是start++。有关前增量和后增量的更多信息,您可以参考this link
  • 完美。那解决了它。我还必须更改第 2 行和第 3 行,(start > end) 和 (a.length==0) 条件,改为返回 true。我猜测试的设置是为了声明没有值意味着所有值都是相同的......(模棱两可/主观?)
  • @BCronyn 说空数组的所有值彼此相等是有道理的:)
  • @BCronyn 我认为 if (start > end) return false; 行可以简单地删除,因为该条件永远不会为真(递归在 start == end 时结束),除非您将无效参数传递给初始调用,在这种情况下,抛出 IllegalArgumentException 会更有意义。
【解决方案2】:

最简单的方法可能是简单地取数组的第一个值并遍历直到单个值不相同。

public void allEqual(int[] arr) {
    if(arr.length==0) return false;
    for(int i=0; i<arr.length; i++)
        if(arr[0]!=arr[i]) return false;
    return true;
}

编辑:意识到这个答案是用递归来做的,而我的答案没有这样做。

【讨论】:

  • 好答案无论如何......你是对的,当我被要求查找所有值是否相等时,搜索不相等的值似乎违反直觉。我将在未来进行重构。
【解决方案3】:

您可以使用经典的分而治之的方法来解决它。将数组分成两半,直到有两个元素,然后检查它们是否相等。然后征服他们并比较价值观。像这样的:

class Ideone {

    static boolean checkEquals(int a[], int start, int length) {

        if (length==2)
            return a[start]==a[start+1] && a[start]==a[0];
        else
            return checkEquals(a,start+0,length/2) &&
                   checkEquals(a,start+length/2,length/2);     
    }

    public static void main (String[] args) {
        int a[]={1,1,1,1,1,1,1,1};
        System.out.println(checkEquals(a,0,8));
    }
}

执行here

【讨论】:

  • 整数长度/2加整数长度/2总是等于长度吗?尝试一些奇怪的长度
猜你喜欢
  • 2013-01-27
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 2015-02-12
  • 2021-12-06
相关资源
最近更新 更多