2013-10-15 2 views
1

Я пытаюсь создать рекурсивную функцию, содержащую вектор чисел, и имеет ключ, который является числом, которое мы ищем в векторе.Ошибка рекурсивной функции

Каждый раз, когда ключ найден, функция должна отображать счетчик, сколько раз ключ отображается в векторе.

По какой-то причине моя рекурсивная функция возвращает только номер 1 (Игнорируйте 10 я просто тестирование что-то)

Вот мой код:

int recursive_count(const vector<int>& vec, int key, size_t start){ 
    if (start == vec.size()) 
     return true; 
    return (vec[start] == key? 23 : key) 
     && recursive_count(vec, key, (start+1)); 
} 


int main() { 

    vector <int> coco; 

    for (int i = 0; i<10; i++) { 
     coco.push_back(i); 
    } 

    cout << coco.size() << endl; 

    int j = 6; 


    cout << recursive_count(coco, j, 0) << endl; 

} 
+1

Что происходит, когда вы пройти через него с помощью отладчика? –

+3

Что вы ожидали от результата? Вы возвращаете логический ответ – amit

+0

Не знаете, что вы пытаетесь сделать, но как есть - ваша функция вернет false (0) тогда и только тогда, когда вход 'key' равен 0, а 0 - в векторе. В противном случае он вернется 1. – amit

ответ

2

Мне кажется, что рекурсивная функция, что это бред, но все равно ...

Подумайте о концепциях рекурсии.

Что такое условие перерыва? То, что текущий символ, который проверяется, больше не находится в строке. Вы получили это право.

Но рекурсивный случай неправильный. Вы возвращаете какой-то bool (что с 23-м путем? Один раунд рекурсии должен возвращать 1, если текущий элемент равен ключу, и 0 в противном случае.

Тогда нам нужно только добавить результаты рекурсии, и мы там!

Вот код

int recursive_count(const vector<int>& vec, int key, size_t start) { 
    if (start >= vec.size()) { 
     return 0; 
    } else { 
     return 
     ((vec[start] == key) ? 1 : 0) + 
       recursive_count(vec, key, start+1); 
    } 
} 

Поскольку это даже tail-recursion, хорошие компиляторы будут удалены рекурсию для вас, кстати, и превратить его в его итеративной коллегой ...

+0

Его часть проекта, который они делают для школы по рекурсии. Не против 23, я просто экспериментировал, чтобы увидеть, какой результат я получу. Сейчас я пытался лучше понять рекурсии. –

+0

спасибо за тонну за помощь кстати @nyarlathotep –

+0

Так вы вырвали мою реализацию за несколько минут, когда это было;)? – codeling

0

Согласно integral promotion правил на cppreference.com

Тип bool может быть преобразован в int со значением false, которое становится 0 и true становится 1.

С,

if (start == vec.size()) 
     return true; 

ваша функция с возвращаемым типом int возвращает 1

+0

Пожалуйста, дайте мне знать, что не так. –

+0

Не мое голосование, но я думаю, что здесь есть больше проблем, чем просто тип возврата. –

+0

Спасибо за это @PaulR. Я никогда не утверждал, что мой ответ исчерпывающий и исправляет все ошибки в коде. –

3

Не уверен, что вы пытаетесь сделать, но как есть - ваша функция возвращает ЛОЖЬ (0), если и только если вход key равен 0, и он находится в векторе. В противном случае он вернется 1.

Это потому, что вы в основном выполняете логическую операцию И. Операнды: true для всех значений, которые не равны 0, и единственный способ получить 0 - это если он находится в векторе - и ключ равен 0.

Итак, если вы не получили false (0) вдоль кстати, ответ на булевой формуле true, которая обеспечивает 1.


EDIT:

Если вы пытаетесь сделать сосчитать, сколько раз key в vec - сделайте то же самое, что вы делали в итеративном порядке ч:

  1. Start от 0 (сделать условие остановки return 0; вместо return true;)
  2. Увеличение на 1 каждый раз, когда ключ найден вместо operator&&, используйте operator+.

(я не дал прямого полного ответа, потому что это похоже на HW, попробуйте следовать этим подсказкам и спросите, есть ли у вас больше вопросов).

+0

Ок, я вижу, но когда я изменил его на: if (start == vec.size()) return 0; Я по-прежнему получал ту же ошибку. Стартовая переменная должна быть установлена ​​равной 0 и продолжать увеличиваться на 1 до тех пор, пока она не достигнет размера вектора, а затем закончится рекурсия. –

+1

@MannyO: Это ничего не меняет. '23 && 5 == 1', потому что результат' && 'всегда равен 0 или 1. Вы получили бы только 5, если бы вектор был пуст. Это не так. –

+0

Ну ладно, что я должен использовать вместо «&&»? –

2

Ваша функция recursive_count всегда вычисляется в BOOL

Вы либо явно возвращение истинного

if (start == vec.size()) 
    return true; 

или возвращать булево сравнить

return (vec[start] == key? 23 : key) // this term gets evaluated 
     && // the term above and below get 'anded', which returns true or false. 
     recursive_count(vec, key, (start+1)) // this term gets evaluated 

Затем он получает приведение к вашему типу возврата (int), то есть вы будете получать только 0 или 1.

Смежные вопросы