无法检查数组是不是使用递归排序

Posted

技术标签:

【中文标题】无法检查数组是不是使用递归排序【英文标题】: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 循环实际上是更好的方法 【参考方案1】:

递归不是解决这个问题的好方法。如果您的数组非常大并且您可以获得***Error,该怎么办?为什么不使用简单的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 进行调试。

以上是关于无法检查数组是不是使用递归排序的主要内容,如果未能解决你的问题,请参考以下文章

算法学习——递归之快速排序

给定已排序的数组,如果数组 A 包含元素 A[i] 使得 A[i] = i (递归和分而治之),则返回索引 i

`==` 是不是在 Julia 中递归检查结构?好像没有

快速排序算法(递归)

使用递归实现一个数组的快速排序

使用选择算法编译时间递归排序