Что не так с этой основанной на l oop функцией, которая возвращает позицию элемента? - PullRequest
0 голосов
/ 02 февраля 2020

Эта функция ищет целое число «ключ» в заданном векторе с позиции «старт». Возвращает позицию ключа, если находит. Но если он не находит ключ, он должен вернуть -1.

Тем не менее, он возвращает только -1 в качестве выхода. Функция работает нормально, если оператор else удален, но, очевидно, он мне нужен.

Так что же не так в этой функции? Пожалуйста, объясните простыми словами, я новичок в C ++. Спасибо за твою помощь.

int Sequential_Search(const vector<int>&v, int key, int start){
    int result = 0;
    int i;
    for(i = start; i < v.size(); i++){
        if(v[i] == key){
                result = i; 
                }
        else{
            result = -1;
        }
    }
    return result;  
}

Ответы [ 3 ]

4 голосов
/ 02 февраля 2020

Это довольно легко понять:

 for(i = start; i < v.size(); i++){
        if(v[i] == key){
                result = i; 
                }
        else{
            result = -1;
        }
    }

Допустим, ваш вектор содержит [1, 2, 3, 4] и вы ищете 2, начиная с индекса 0: вот что делает ваш код:

i = 0: (v[i] : 1) == 2 -> false: result = -1
i = 1: (v[i] : 2) == 2 -> true: result = 1
i = 2: (v[i] : 3) == 2 -> false: result = -1
i = 3: (v[i] : 4) == 2 -> false: result = -1

Когда вы нашли свое значение, вы все равно продолжаете читать другое значение, в то время как вам следует остановиться.

  • Либо используя break, либо напрямую возвращая (return i ) в условии v[i] == key;
  • Либо путем проверки результата в условии for (result == -1 && i < v.size())

За комментарий замечание: случай с break и return (последний не такой сложный):

int Sequential_Search(const vector<int>&v, int key, int start){
  int result = -1; // important for 'break'
  for(int i = start; i < v.size(); i++){
     if(v[i] == key){
       result = i; break;
     }
  }
  return result;  
}

int Sequential_Search(const vector<int>&v, int key, int start){
  for(int i = start; i < v.size(); i++){
     if(v[i] == key){
       return i;
     }
  }
  return -1;  
}
0 голосов
/ 02 февраля 2020

Причина сбоя в операторе else заключается в том, что существует множество сценариев ios, что ключ не будет последним элементом в векторе.

Если ключ равен 3 и вектору целых если <1,3,4>, то для l oop будет l oop через 3 раза. На первой итерации он будет go в операторе else, поскольку мы не нашли ключ по 0-му индексу. Результат -1. На второй итерации мы нашли ключ! Установите для результата значение i = 1. Третья итерация снова введет go в оператор else и вернет результат в -1.

Чтобы исправить это, вы можете использовать 'break', чтобы оставить значение l oop, как только вы найдете результат. Установите результат в I, а затем следуйте этому с перерывом; Это гарантирует, что если результат будет найден, вы не будете go снова в операторе else и сбросите его на -1.

0 голосов
/ 02 февраля 2020

Когда l oop находит ключ, он устанавливает result = i - но он не останавливает цикл. На следующей итерации v[i], скорее всего, не равно key, а l oop сбрасывает result в -1. Функция возвращает -1, если только key не соответствует последнему элементу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...