下面是我使用过的代码。它返回 0 作为计数。这里的错误原因是什么?基本条件是否不充分?
#include<bits/stdc++.h>
using namespace std;
int CountZeros(int a[], int n, int count) {
int i = 0;
//base condition
if (n == 0) return 0;
if (a[0] == 0) {
count += 1;
}
int SmallAns = CountZeros(a + 1, n - 1, count);
}
int main() {
int count = 0;
int a[5] = {
1,
0,
3,
0,
5
};
CountZeros(a, 5, count);
cout << count;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
您的函数在递归情况下不会返回任何内容,从而导致未定义的行为。
\n(递归函数的工作方式与非递归函数 \xe2\x80\x93 完全相同,如果您没有return值,则不会返回任何值。)
您的目标似乎是尾递归,在这种情况下,基本情况应该返回累积参数 ( count),而不是基值,并且您使用基值(零)进行初始调用:
int CountZeros(int a[], int n, int count) {\n\n if (n == 0) \n return count;\n else \n return CountZeros(a + 1, n - 1, a[0] == 0 ? count + 1 : count);\n}\nRun Code Online (Sandbox Code Playgroud)\n使用非尾递归,您不会count作为参数传递,而是添加到递归结果中:
int CountZeros(int a[], int n) {\n\n if (n == 0) \n return 0;\n int SmallAns = CountZeros(a + 1, n - 1);\n return a[0] == 0 ? SmallAns + 1 : SmallAns;\n}\nRun Code Online (Sandbox Code Playgroud)\n尽管 \xe2\x80\x93 一个不错的编译器会将尾递归版本转换为一个简单的循环(gcc、clang 和 msvc 都这样做),但效率较低。
\n