我正在写一个简单的中点计算递归:
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)
进入这种情况,但概念上我不明白,即在编写代码时,我如何认识和避免这种情况而不必调试?
1条答案
按热度按时间rvpgvaaj1#
最终该方法将被调用
0
作为起点和终点1
作为结束。mid
将0
也一样,但条件(start == end)
会是假的。方法
midPoint(0, 0-1, array);
威尔打电话来(start == end)
永远不会是真的,方法会无限次地调用自己。我不明白你的代码点是什么,但也许你应该把它改成
(start >= end)