【问题标题】:Method doesn't exit after return statementreturn 语句后方法不退出
【发布时间】:2017-02-09 10:05:08
【问题描述】:

研究一种方法,该方法使用中位数算法的中位数选择一个枢轴来查找数组中的第 k 个最小元素;但是返回后它似乎没有退出pickCleverPivot:

return median(A,left,right);

如果有帮助,假设最初左边是 0,右边是 9,A 是 {1,2,3,4,5,6,7,8,9,10}。

方法如下:

private static int pickCleverPivot(int left, int right, int[] A){

    int index = 0;                                                  
    if((right-left) <= 5){                                          
        return median(A,left,right);
    }

    for(int i = 0; i < (A.length+5-1)/5; i++){      //Ceiling of n/5 = (A.length+5-1)/5). 

        int R = left+4;  
        if(R > right){
            R = right;                                              
        }

        int med_index = median_index(A,left,R);

        swap(A, med_index, index);
        index++;
        left +=5;
    }

    left = 0;
    return pickCleverPivot(left, left+(A.length+5-1)/5, A);

}

【问题讨论】:

  • 嗯,如果你的 lft 是 0,right 是 9,right - left = 9 & it's > 5,所以它不会进入那个 return 语句,是吗?那么,它会继续向下调用median_index和swap,这可能是瓶颈。

标签: java arrays return median-of-medians


【解决方案1】:

我想我找到了一些东西:

每次对函数进行递归调用时,都使用相同的参数。 (A.length+5-1)/5 保持相同的值,因为 A 始终是相同的数组。所以如果它大于 5,你永远不会逃避你的递归函数,因为right - left &lt; 5 永远是假的。

【讨论】:

    【解决方案2】:

    我会说,进行逐步调试,最有可能的是,有一个无限循环导致返回停止从方法返回。或者,把完整的代码贴出来,我可以试试找bug。

    【讨论】:

      【解决方案3】:

      您的代码应该无法忽略 return 语句。

      也许您创建了一个无限循环? 如果您想在代码中查找错误,只需添加大量打印语句即可。例如在返回之前打印所有方法的返回值。

      如果您仍然找不到错误,您应该发布您的所有代码,以便我们能够自行运行您的代码。

      【讨论】:

        猜你喜欢
        • 2017-07-28
        • 2014-09-30
        • 1970-01-01
        • 1970-01-01
        • 2019-07-31
        • 2013-11-23
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多