看到二分查找用的是递归思想,并且使用的是尾递归方式,想梳理一下它的函数直接递归调用是如何的。
先上二分查找的尾递归实现吧
private static int MidSearch(int left, int right, int[] array, int target) {
if (left>=right){//当左右下标出现重合的时候,说明找不到,直接返回-1
return -1;//
}
int mid = (right + left) / 2;
if (array[mid] < target) {//向右递归查找
return MidSearch(mid + 1, right, array, target);
} else if (array[mid] > target) {//向左递归查找
return MidSearch(left, mid - 1, array, target);
} else {
return mid;//不满足大于、小于,那就是等于
}
}
可以看到函数最后返回的时候又调用了自己。我们来看尾递归调用的过程。可以看到函数返回后就结束了。
调用自身过程:
第一层调用自己后会暂停等待结果;
第二层没找到结果值也会调用自己,然后暂停等待结果;
...
直到某一层n找到了结果(二分查找中即代表目标值K的位置index),或一直没找到返回-1;
返回值过程:
第n层结束递归调用,返回一个值index或-1;
第n-1层拿到第n层返回的值后,恢复运行,直接返回index或-1;
第n-2层拿到第n-1层返回的值后,恢复运行,直接返回index或-1;
...
第一层拿到第二层返回的结果后,恢复运行,直接返回index或-1。