Ошибка вектора, очень запутанная ошибка сегментации? - PullRequest
1 голос
/ 16 июня 2019

Итак, в основном, я делаю код, который ищет элемент вектора внутри вектора. Пока я думал о подходе, его реализация вызвала ошибку сегментации.Я сузил проблему

В коде, если я разлагаю строку в цикле 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 ]

1 голос
/ 16 июня 2019

Ваш код неправильно обрабатывает последний случай и заканчивается бесконечной рекурсией.

Это, к сожалению, в C ++ означает, что может случиться что угодно (вы не гарантированно получите значимую ошибку).

Добавьте отладочную печать в начале функции, и вы увидите, в каких случаях вы вводите бесконечную рекурсию.

0 голосов
/ 16 июня 2019

У вас есть бесконечная рекурсия в третьем, если стат Правильный код, если следующий:

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...