Вы забыли вернуться из функции в этом случае
find(v, value, n - 1);
Тем не менее функция в любом случае определена неправильно.
Она должна выглядеть как
template <class T>
bool find( const std::vector<T> &v, const T &value, typename std::vector<T>::size_type n )
{
return v.size() < n || n == 0 ? false : v[n-1] == value || find( v, value, n - 1 );
}
Вот демонстрационная программа.
#include <iostream>
#include <iomanip>
#include <vector>
template <class T>
bool find( const std::vector<T> &v, const T &value, typename std::vector<T>::size_type n )
{
return v.size() < n || n == 0 ? false : v[n-1] == value || find( v, value, n - 1 );
}
int main()
{
std::vector<int> v = { 1, 2, 3, 4, 5 };
std::cout << std::boolalpha << find( v, 5, v.size() ) << '\n';
std::cout << std::boolalpha << find( v, 5, v.size() - 1 ) << '\n';
std::cout << std::boolalpha << find( v, 1, 1 ) << '\n';
std::cout << std::boolalpha << find( v, 2, 1 ) << '\n';
return 0;
}
Выходные данные:
true
false
true
false
Что касается реализации вашей функции, то она будет иметь неопределенное поведение, например, для этого вызова
find( v, 5, v.size() )
из-за использования недопустимого индекса, равного v.size()
, в этом операторе if
if (v[n] == value) {
cout << v[n] << " == " << value << endl;
return true;
}
Фактически пользователь может указать третий аргумент, превышающий размер массива. Таким образом, более гибкий подход состоит в том, чтобы позволить пользователю указать любое значение для третьего аргумента, но выполнить поиск среди существующих элементов вектора. Вот такое определение функции.
#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
template <class T>
bool find( const std::vector<T> &v, const T &value, typename std::vector<T>::size_type n )
{
n = std::min( n, v.size() );
return n != 0 && ( v[n-1] == value || find( v, value, n - 1 ) );
}
int main()
{
std::vector<int> v = { 1, 2, 3, 4, 5 };
std::cout << std::boolalpha << find( v, 5, 6 ) << '\n';
std::cout << std::boolalpha << find( v, 5, 4 ) << '\n';
return 0;
}
Вывод программы:
true
false