【问题标题】:Checking if an array contains an int with recursion and certain limitations检查数组是否包含具有递归和某些限制的 int
【发布时间】:2020-03-20 03:09:17
【问题描述】:

我遇到了以下问题:创建一个递归方法来检查给定数组是否包含给定值。这应该通过将数组分成两半来完成,因此需要两次递归调用。

对我来说问题是方法头不包含任何指定的索引范围,可以通过递归进行更改,以便搜索数组中的每个值。我现在尝试将与值进行比较的索引修复为 0,并继续将数组分成两半,以便数组中的每个值在某个点都有索引 0。但是它不起作用,我不明白为什么。如果有人能给我一个关于我做错了什么的线索,那将很有帮助,因为我对 java 还是很陌生。

我的限制如下:不能改变方法头,不能全局变量,不能循环,只允许的类是:String、Array、Math、Integer。

例子:

int[] array = {2, 4, 7, 10, -10, 4, 0, 0, 27, 11, 4, 6};

System.out.println(containsValue(array4, 11)); 这应该是正确的,但在我的代码中它是错误的。

代码:

private static boolean containsValue(int[] workArray, int value) {

    int count = 0;
    boolean hasValue;

    if (workArray.length > 1) {
        int[] firstHalfArray = Arrays.copyOfRange(workArray, 0, (workArray.length / 2) - 1);
        if (firstHalfArray[count] == value) {
            hasValue = true;
            return containsValue(firstHalfArray, value) || hasValue;
        }
    }

    if (workArray.length > 1) {
        int[] secondHalfArray = Arrays.copyOfRange(workArray, 6, workArray.length - 1);
        if (secondHalfArray[count] == value) {
            hasValue = true;
            return containsValue(secondHalfArray, value) || hasValue;
        }

    }

    return false;

}


public static void main(String[] args) {

    int[] array4 = {2, 4, 7, 10, -10, 4, 0, 0, 27, 11, 4, 6};
    System.out.println(containsValue(array4, 11));
    System.out.println(containsValue(array4, 2));
    System.out.println(containsValue(array4, 25));
    System.out.println(containsValue(array4, 0));
    System.out.println(containsValue(array4, 14));
    System.out.println(containsValue(array4, 6));
}

提前致谢

更新:我已经调整并调整了我的代码。我的基本情况非​​常错误,谢谢。它的其余部分仍然没有按照我想要的方式工作,即使对于我来说递归是正确实现的(我仍然继续将它分成两半,直到达到基本情况(workArray.lenght == 1)并检查是否数组中的单个 int 等于 value。我还做错了什么?

private static boolean containsValue(int[] workArray, int value) {

        int count = 0;

        if (workArray.length > 1) {
            int[] firstHalfArray = Arrays.copyOfRange(workArray, 0, (workArray.length / 2));
            return containsValue(firstHalfArray, value);
        }

        if (workArray.length > 1) {
            int[] secondHalfArray = Arrays.copyOfRange(workArray, workArray/2, workArray.length - 1);
            return containsValue(secondHalfArray, value);
        }

        if (workArray[count] == value) {
            return true;
        }
        return false;

【问题讨论】:

  • 对我来说问题是方法头不包含任何指定的索引范围,可以通过递归进行更改:然后创建另一个递归方法,并调用另一个方法0,array.length 作为参数。你的方法有一个明显的错误:如果数组只有一个元素,它总是返回 false。
  • 这也是不允许的..
  • 递归细分的思想是检查基本情况,看看你是否可以简单地解决它。在这里查找 1 个元素的列表并将其返回。否则将数组拆分为 2 并在每一半上重复出现(注意一半的长度不为 0)。为此,请查看 List.subList()。这种方法只需要恒定的空间和时间。 docs.oracle.com/javase/8/docs/api/java/util/…
  • 再一次,你的基本情况(一个只有一个元素的数组)被错误地实现了:它总是返回 false。对于所有其他情况,您应该将数组一分为二,如果两个子数组之一包含该数字,则返回 true。您的 hasValue 变量不应该存在。
  • @gurioso 同意,但是递归方法是荒谬的:如果完成了数组的多个副本(使用隐藏循环),您最好只遍历数组。我知道这只是为了学习,但是不允许创建方法的限制破坏了使用递归的意义。

标签: java arrays recursion


【解决方案1】:

不明白

  • 为什么你需要这个递归
  • 为什么要复制数组子集...最好在方法参数中保留搜索范围 containsValue(int[] workArray, int value, int startindex, int endidex)
  • copyOfRange 中的最后一个属性是结束索引,但排他性

    private static boolean containsValue(int[] workArray, int value) {
    
        if (workArray.length == 0) return false;
        if (workArray[0] == value) return true;
        if (workArray.length == 1) return false;
    
        int middle = workArray.length / 2;
    
        int[] firstHalfArray = Arrays.copyOfRange(workArray, 0, middle);
        if(containsValue(firstHalfArray, value)) return true;
        int[] secondHalfArray = Arrays.copyOfRange(workArray, middle, workArray.length);
        return containsValue(secondHalfArray, value);
    
    }
    

【讨论】:

  • 根据此任务的规范,此任务需要使用递归。感谢您的解决方案
猜你喜欢
  • 2012-11-27
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2012-08-14
  • 1970-01-01
  • 2017-01-08
  • 2013-10-17
  • 1970-01-01
相关资源
最近更新 更多