0

如果该值是向量的前 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。

4

2 回答 2

3

您需要返回结果find

return find(v, value, n - 1);

在你的功能中。

如果你打开警告,编译器会告诉你你做错了什么。

此外,您的基本情况似乎不正确。0是一个有效的索引。n如果是,你应该停止-1

与您的问题相关,使用递归方法在连续容器中查找元素似乎很奇怪。你为什么不试试类似的东西

std::find(v.begin(), v.begin() + n, value);

您可以比较 to 的结果findv.begin() + n检查是否找到该元素。

于 2020-04-12T22:01:44.110 回答
0

在这种情况下,您忘记从函数返回

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
于 2020-04-12T22:10:43.097 回答