ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

重温二分查找与尾递归

2021-11-20 10:32:47  阅读:108  来源: 互联网

标签:二分 arr target 递归 int 重温 mid start


重温二分查找与尾递归

1 问题来源:“递归”这个洪水猛兽

“递归”越深,占用的“堆栈”空间越大,如果使用“递归”实现“二分查找”,堆栈空间以 l o g 2 N log_2{N} log2​N的形式增长,这就太尴尬了!然而,“递归”这种程序设计模式方便人类阅读,那么有没有什么办法解决这个“堆栈空间占用过巨”的问题呢?

答:可以使用“尾递归

尾递归和普通递归的区别在于:是否让函数返回值参与运算!
如果使用尾递归,就不要返回值传参,可以把要返回的值通过函数的“参数列表”传递

2 代码

2.1 循环体实现二分查找

int BinarySearch(int target, int *arr, int len)
{
    int start = 0;
    int end = len - 1;

    while(start <= end){
        int mid = (start + end) / 2;
        if(arr[mid] == target){
            return mid;
        }else if(target < arr[mid]){
            end = mid - 1;
        }else{
            start = mid + 1;
        }
    }

    return -1;
}

2.2 尾递归实现二分查找

int recursion_BinarySearch(int target, int *arr, int start, int end)
{
    if(start > end){ // Termination conditions
        return -1;
    }else{
        int mid = (start + end) >> 1;
        if(target == arr[mid]){
            return mid;
        }else if(target < arr[mid]){
            end = mid - 1;
        }else{
            start = mid + 1;
        }
        return recursion_BinarySearch(target, arr, start, end);
    }
}

3 性能测试

测试用例

int arr[] = {1, 6, 9, 21, 100, 155, 165, 243, 255};
int main(int argc, char *argv[])
{
    int target = 165;
    int index = -1;
    index = recursion_BinarySearch(target, arr, 0, sizeof(arr)/sizeof(int)-1);
    if(index > -1){
        printf("%d is founded. Index = %d\r\n", target, index);
    }else{
        printf("%d is not founded!\r\n", target);
    }
    return 0;
}

3.1 普通递归(GCC默认-O1)

在这里插入图片描述

3.2 尾递归(GCC 开启-O2及以上优化)

在这里插入图片描述

在这里插入图片描述

标签:二分,arr,target,递归,int,重温,mid,start
来源: https://blog.csdn.net/weixin_46201756/article/details/121435535

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有