【发布时间】:2020-07-25 11:21:34
【问题描述】:
如果值是向量的前 n 个条目之一,则该函数应该返回 true,否则返回 false。我已经为此工作了一段时间,但无法弄清楚为什么它不能正常工作。
template <class T>
bool find(const vector<T> &v, T value, int n) {
//base case
if (n == 0) {
cout << "not here" << endl;
return false;
}
//general case
if (v[n] == value) {
cout << v[n] << " == " << value << endl;
return true;
}
cout << "find(" << "v" << ", " << value << ", " << n - 1 << ")" << endl;
find(v, value, n - 1);
}
couts 只是因为我不擅长调试。以下是我对其进行的测试和结果:
vector<int> v = {1, 2, 3, 4, 5};
cout << boolalpha << find(v, 3, 4);
控制台:
find(v, 3, 3)
find(v, 3, 2)
3 == 3
false
显然,该函数正在查找匹配值,但我非常困惑为什么它仍然返回 false。
【问题讨论】:
-
如果既不是
n==0也不是v[n] == value,函数返回什么? -
除了缺少的
return,您的函数永远不会查看v[0],因此如果它恰好在第一个元素中,将永远找不到该值。回想一下,前三个元素是v[0]、v[1]和v[2];但不是v[3]。 -
为什么不使用 for 循环?这里不需要递归函数,循环更容易阅读
-
@goaran 如果这不是练习,应该使用
std::find。 -
一个向量可以容纳数千甚至数百万个元素并不是不合理的。为这样的容器编写递归查找函数是没有意义的,因为您会用尽堆栈空间来尝试查找元素。
标签: c++ recursion search vector function-definition