理解递归函数中的错误

Understanding an error in a recursive function?

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

我正试图编写一个递归函数,但在行中出现错误:n+sum(n-1);我的编译器是德语,所以错误消息的糟糕翻译是:"无效值没有按预期忽略"。谢谢你的帮助!

void sum (int n)
{
    if(n==0)
    {
        cout << n << endl;
    }
    else if(n>0)
    {
        n + sum(n-1);
        cout << n << endl;
    }
}
int main()
{
   sum(3);
   return 0;
}

注意,您已经将函数定义为

void sum (int n);

此函数没有返回值。然而,在这个代码中:

n + sum(n-1);

您正试图将n添加到sum(n - 1)的返回值中,这是不合法的,因为sum(n - 1)不会产生值。

要解决此问题,您可能需要更改函数,使其返回int。如果您这样做,您将需要进行其他更改,例如在函数中添加return语句,但这将有助于您步入正轨。

希望这能有所帮助!

您的sum方法返回void,将其更改为int

int sum (int n)

sum()方法应该返回一个值,它应该返回总和。你应该像这个一样定义它

int sum (int n)
{
if(n==0)
{
 cout << n << endl;
 return 0;
}
else if(n>0)
{
    cout << n << endl;
    return n + sum(n-1);
 }
 }

您尝试将n和sum(n-1)相加,但sum没有返回值,因此这是一个错误。您应该修改sum以返回int,并在两个if体中添加return语句。

当您编写"void sum"时,您告诉编译器sum不会返回任何内容。这是错误的。尝试用int.

替换"void"

我明白了。我有点傻。它当然必须是n=n+sum(n-1);还有一个int函数。谢谢大家。

  • 递归函数需要在每个尾部位置返回一些东西
  • 递归函数需要在每次递归时使问题变小

以下是如何做到这一点的一个例子:

int sum (int n)
{
    return n == 1 ? 1 : n + sum_rec(n-1);
}
int main()
{
   cout << sum(3) << endl;
   return 0;
}

如果你的C编译器做尾调用优化,那就更好了:

// just a helper for sum_it
int sum_aux (int n, int accumulator)
{
    return n == 0 ? accumulator : sum_rec(n-1, accumulator + n);
}
int sum_it (int n)
{
    sum_aux(n, 0);
}