递归函数错误

时间:2013-10-15 13:24:03

标签: c++ function loops recursion vector

我试图创建一个包含数字向量的递归函数,并且有一个键,这是我们在向量中寻找的数字。

每次找到该键时,该函数都应显示该键在向量中出现的次数。

出于某种原因,我的递归函数只返回数字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 个答案:

答案 0 :(得分:3)

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

这是因为你基本上做了布尔AND操作。对于非0的所有值,操作数为true,获得0的唯一方法是 - 如果它在向量中 - 并且键为0。

所以,除非你得到false(0),否则布尔公式的答案是true,它提供1。


修改

如果您要计算key vecreturn 0;的次数 - 请执行与迭代方法相同的操作:

  1. 从0开始(停止条件return true;代替operator&&
  2. 只要找到密钥而不是operator+,就增加1,使用{{1}}。
  3. (我没有给出直接的完整答案,因为它看起来像是HW,尝试遵循这些提示,并询问您是否有更多问题)。

答案 1 :(得分:2)

你的recursive_count函数总是计算为bool

您要么显式返回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。

答案 2 :(得分:2)

对我来说,这似乎是一个无意义的递归函数,但无论如何......

考虑递归概念。

什么是休息条件?要检查的当前字符不再在字符串中。你做对了。

但递归案例是错误的。你返回某种bool(顺便提一下23是什么? 如果当前元素等于key,则一个递归循环需要返回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,好的编译器会顺便删除递归,并将其转换为迭代对应...

答案 3 :(得分:0)

根据integral promotion

上的cppreference.com规则
  

类型bool可以转换为int,值为false   0并且真正变为1。

使用,

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

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