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;

}
4

4 回答 4

3

不确定您要做什么,但按原样 - 当且仅当输入key为 0 并且它在向量中时,您的函数才会返回 false (0)。否则它将返回 1。

这是因为您基本上是在进行布尔 AND 运算。操作数适用true于所有非 0 的值,获得 0 的唯一方法是 - 如果它在向量中 - 并且键是 0。

false因此,除非您一路得到(0),否则布尔公式的答案是true,它提供 1。


编辑:

如果您尝试计算其中的次数key-vec执行与迭代方法相同的操作:

  1. 从 0 开始(以停止条件return 0;代替return true;
  2. 每当找到密钥而不是使用时增加 1 operator&&,使用operator+.

(我没有给出直接完整的答案,因为它看起来像硬件,请尝试遵循这些提示,并询问您是否有更多问题)。

于 2013-10-15T13:29:07.747 回答
2

您的 recursive_count 函数始终计算为布尔值

您要么明确返回 true

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。

于 2013-10-15T13:33:36.807 回答
2

对我来说,递归函数似乎是无稽之谈,但无论如何......

考虑递归概念。

什么是中断条件?正在检查的当前字符不再在字符串中。你说对了。

但是递归情况是错误的。您返回某种布尔值(顺便说一下,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,所以好的编译器会顺便为您删除递归,并将其变成它的迭代对应物......

于 2013-10-15T13:36:14.753 回答
0

根据cppreference.comintegral promotion上的规则

bool 类型可以转换为 int,值 false 变为​0​,true 变为 1。

和,

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

你的函数返回类型int返回1

于 2013-10-15T13:28:40.237 回答