我试图创建一个包含数字向量的递归函数,并且有一个键,这是我们在向量中寻找的数字。
每次找到该键时,该函数都应显示该键在向量中出现的次数。
出于某种原因,我的递归函数只返回数字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;
}
答案 0 :(得分:3)
不确定你要做什么,但是不确定 - 当且仅当输入key
为0并且它在向量中时,你的函数才会返回false(0)。否则它将返回1.
这是因为你基本上做了布尔AND操作。对于非0的所有值,操作数为true
,获得0的唯一方法是 - 如果它在向量中 - 并且键为0。
所以,除非你得到false
(0),否则布尔公式的答案是true
,它提供1。
修改强>
如果您要计算key
vec
中return 0;
的次数 - 请执行与迭代方法相同的操作:
return true;
代替operator&&
)operator+
,就增加1,使用{{1}}。 (我没有给出直接的完整答案,因为它看起来像是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)
类型bool可以转换为int,值为false 0并且真正变为1。
使用,
if (start == vec.size())
return true;
返回类型为int
的函数返回1