如何使用递归计算数组中0的数量?

0 c++ recursion

下面是我使用过的代码。它返回 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)

mol*_*ilo 5

您的函数在递归情况下不会返回任何内容,从而导致未定义的行为。
\n(递归函数的工作方式与非递归函数 \xe2\x80\x93 完全相同,如果您没有return值,则不会返回任何值。)

\n

您的目标似乎是尾递归,在这种情况下,基本情况应该返回累积参数 ( count),而不是基值,并且您使用基值(零)进行初始调用:

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

使用非尾递归,您不会count作为参数传递,而是添加到递归结果中:

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

尽管 \xe2\x80\x93 一个不错的编译器会将尾递归版本转换为一个简单的循环(gcc、clang 和 msvc 都这样做),但效率较低。

\n