首页 > 解决方案 > 简单的中点递归混淆

问题描述

我正在编写一个简单的中点计算递归:

    public static void main(String[] args) {
        int[] array = {0, 1, 2, 3, 4, 5, 6};
        midPoint(0, array.length - 1, array);
    }
    
    private static void midPoint(int start, int end, int[] array) {
        int mid = (start + end) >>> 1;

        if (start == end) return;
        
        midPoint(start, mid, array);
        midPoint(mid + 1, end, array);      
        
    }

此代码工作正常,但如果我将最后两行更改为:

        midPoint(start, mid - 1, array);
        midPoint(mid, end, array);      

然后代码进入无限递归并导致堆栈溢出。打印这些值后,我意识到后来,我意识到midPoint(1, -1, array)进入这种情况,但从概念上讲我不明白,即在编写代码时我如何实现并避免这种情况而无需调试?

标签: javarecursion

解决方案


最终,该方法将以0start 和1end 调用。
mid也会0如此,但条件(start == end)将是错误的。
该方法midPoint(0, 0-1, array);将被调用,并且(start == end)
永远不会是真的,并且该方法将无限次调用自身。
我不明白您的代码点是什么,但也许您应该将其更改为(start >= end)


推荐阅读