理解递归函数中的错误?

时间:2013-11-28 21:40:54

标签: c++ recursion

我正在尝试编写一个递归函数,但在行中出错:n + sum(n-1); 我的编译器是德语,因此错误消息的翻译很糟糕:“void value不会被忽略”。感谢帮助!

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;
}

7 个答案:

答案 0 :(得分:5)

请注意,您已将该功能定义为

void sum (int n);

此功能没有返回值。但是,在此代码中:

n + sum(n-1);

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

要解决此问题,您可能需要更改该函数,以便返回int。如果你这样做,你需要进行其他更改,例如在函数中添加return语句,但它应该有助于你走上正确的轨道。

希望这有帮助!

答案 1 :(得分:3)

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

int sum (int n)

答案 2 :(得分:2)

你的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);
 }
 }

答案 3 :(得分:1)

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

答案 4 :(得分:1)

当你写“无效总和”时,你告诉编译器总和不会返回任何东西。这是错的。尝试用int替换“void”。

答案 5 :(得分:0)

我明白了。对我来说有点愚蠢。它当然必须是n = n + sum(n-1); 和一个int函数。 多谢你们。

答案 6 :(得分:0)

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

以下是如何执行此操作的一个示例:

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);
}