【问题标题】:Having trouble checking if an array is sorted using recursion无法检查数组是否使用递归排序
【发布时间】:2019-03-11 05:07:22
【问题描述】:

这是问题:如果数组的每个元素小于或等于下一个元素,则数组被排序(按升序)。

编写一个名为 isSorted 的布尔值方法,它接受一个整数数组和数组中的元素个数,并返回数组是否已排序。

在显示代码之前:我的逻辑是 if else-if 和 else 语句应该首先确定数组的大小是 0、1 还是 2。这是因为当大小等于 1 或 2 时,程序必须打破。当大小大于 2 时,程序应检查 arr[size-1] > arr[size-2],然后再次调用该方法,如果为真则减小大小,如果不为真则返回假。当我运行该程序时,以下 2 个测试失败:[1,3,2,4] 和 [2,1,2,3,4]。因此,我指定当大小等于 2 时,如果 arr[0] > arr[1] 则该方法返回 false,但它不起作用。我究竟做错了什么?我不想只查找答案,因为我正在为考试而学习,所以如果有重复的答案,我很抱歉。

我知道循环更好我只是想研究递归

public boolean isSorted(int[] arr, int size) { 


    if(size == 0 || size == 1) { 

         return true; 

    } else if (size == 2) { //this is the part I don't get. 

        if (arr[0] > arr[1]) { 

            return false; 

        } else { 

             isSorted(arr,size-1); 
             return true;   

        }


    } else {

         if (arr[size-1] < arr[size-2]) { 

             return false;  

         } else { 

            isSorted(arr, size-1); 
            return true; 

         }

    }

}

【问题讨论】:

  • 发布的任务没有限制你必须使用递归来解决任务。使用简单的 for 循环实际上是更好的方法

标签: java algorithm sorting recursion


【解决方案1】:

递归不是解决这个问题的好方法。如果您的数组非常大并且您可以获得StackOverflowError,该怎么办?为什么不使用简单的if 运算符:

public static boolean isSorted(int[] arr, int size) {
    if (arr.length >= 2)
        for (int i = 1; i < arr.length; i++)
            if (arr[i - 1] > arr[i])
                return false;

    return true;
}

【讨论】:

    【解决方案2】:

    您需要从isSorted返回结果,例如,更改:

    isSorted(arr, size-1); 
    return true; 
    

    return isSorted(arr, size-1); 
    

    而且,else if (size == 2) 的情况是多余的。 size 2应该和size 3, 4, 5, ...有相同的逻辑


    完整代码:

    public boolean isSorted(int[] arr, int size) {
        if (size == 0 || size == 1) {
            return true;
        } else {
            if (arr[size - 1] < arr[size - 2]) {
                return false;
            } else {
                return isSorted(arr, size - 1);
            }
        }
    }
    

    【讨论】:

    • 谢谢,你能解释一下为什么我们必须有一个单独的 else if 语句来处理 size 等于 2 的情况吗?
    • @Person 不,这是多余的。 size 为 2 时,与 size 3, 4, 5, ... 的逻辑相同
    • 似乎size == 0 条件也是多余的
    • @Maxim 这是一个极端情况。当原始数组的长度为0时。
    • @Person 您可能想学习如何使用调试器。它有很大帮助。您可以使用 Eclipse、IntelliJ IDEA 等 IDE 进行调试。
    猜你喜欢
    • 2022-06-10
    • 2021-04-15
    • 2021-11-19
    • 1970-01-01
    • 2020-06-04
    • 2014-03-26
    • 2012-11-30
    • 2012-04-08
    • 2016-04-24
    相关资源
    最近更新 更多