在这种情况下,您忘记从函数返回
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