递归函数错误

Recursive Function Error

本文关键字:错误 递归函数      更新时间:2023-10-16

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

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

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

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

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

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


编辑:

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

  1. 从 0 开始(将停止条件设为return 0;而不是return true;
  2. 每当找到键时增加 1 而不是使用 operator&& ,请使用 operator+

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

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

考虑递归概念。

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

但是递归案例是错误的。你返回某种布尔值(顺便说一下,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);
    }
}

由于这甚至是尾递归,好的编译器会顺便为你删除递归,并将其转换为迭代对应物......

你的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。

根据integral promotion cppreference.com 规则

布尔类型可以转换为 int,值 false 变为 0 和 true 变为 1。

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

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