向量错误,非常令人困惑的细分错误?

时间:2019-06-16 18:42:40

标签: c++ vector binary-search-tree binary-search

所以基本上,我正在做一个代码,在向量中搜索向量的元素。虽然我想到了这种方法,但实现它却给了我一个分割错误。我缩小了问题范围

在代码中,如果我在注释上面的代码时对for循环中的行进行了分解,那么将显示B [i]的所有元素。为什么会引发分段错误。我认为binary_return或多或少是正确的,如果我将其替换为  binary_return(A,0,A.size(),B[1]) ,然后开始工作。 这是代码:

#include<iostream>
#include<vector>

using namespace std;

int binary_return(vector<int> a,int start,int end,int seek)
{
    int mid = (start+end)/2;
    //cout<<start<<" "<<seek<<" "<<mid;
    if(end!=start)
    {
        if(a[mid]==seek)
        {
            return mid;
        }
        else if(a[mid]>seek)
        {
            return binary_return(a,start,mid,seek);
        }
        else if(a[mid]<seek)
        {
            return binary_return(a,mid,end,seek);
        }
    }
    else
        return -1;
}

int main()
{
    vector<int> A{1,3,6,9,23};
    vector<int> B{1,4,23};
    cout<<B[0]<<B[1]<<B[2];
    for(int i=0;i<B.size();i++)
    {
        cout<<binary_return(A,0,A.size(),B[i]);
        //cout<<binary_return(A,0,A.size(),B[0]);
    }
    return 1;
}

2 个答案:

答案 0 :(得分:1)

您的代码无法正确处理最后一种情况,并最终导致无限递归。

不幸的是,在C ++中,这意味着任何事情都可能发生(您不能保证会得到有意义的错误)。

在函数开始处添加调试打印,您会看到在什么情况下您将进入无限递归。

答案 1 :(得分:-1)

如果有陈述,您可以无限次递归 正确的代码,如果满足以下条件:

#include<iostream>
#include<vector>

using namespace std;

int binary_return(vector<int> a,int start,int end,int seek)
{
    int mid = (start+end)/2;
    //cout<<start<<" "<<seek<<" "<<mid;
    if(end!=start)
    {
        if(a[mid]==seek)
        {
            return mid;
        }
        else if(a[mid]>seek)
        {
            return binary_return(a,start,mid,seek);
        }
        else if(a[mid]<seek)
        {
            // In your sample you forgot to add +1 (mid+1) for next start
            return binary_return(a,mid+1,end,seek);
        }
    }
    else
        return -1;
}

int main()
{
    vector<int> A{1,3,6,9,23};
    vector<int> B{1,4,23};
    for(int i=0;i<B.size();i++)
    {
        cout<<binary_return(A,0,A.size(),B[i]);
    }
    return 0;
}