在C中编写递归函数

时间:2017-03-04 11:38:21

标签: c if-statement recursion

我正在研究如何编程并且最近一直在研究一个问题,该问题计算从最小到最大的2个输入数字的总和。例如,如果有人输入数字4,7。计算将是4 + 5 + 6 + 7 = 22.

我已经尝试了我认为recSum的定义,但显然它是错误的,因为我遇到了分段错误。我的定义有什么问题?

/* Define the recursive function */
int recSum (int x, int max)
{
int incrementalSum = 0;
if (x == max) 
{
   return x; /* Exit if summated lower to upper numbers */
}
else
{
   return (x + recSum(x++, max)); /* My recursive call */
}
} /* End of function call */

*上面显示了新代码,抱​​歉,我使用了错误的代码。

3 个答案:

答案 0 :(得分:5)

您的代码有3个重要问题

  1. 表达式

    incrementalSum = x + x++;
    

    未定义,read this for more information

  2. 你的函数不是递归的,递归函数会调用它直到条件发生它应该结束的时候。

  3. 另外,注意到我不是一个非理性的" 永远不会使用goto",这正是为什么有些人反对使用goto的建议。

答案 1 :(得分:2)

您的代码无法正常工作的原因是:

return x + recSum(x++, max);

x++递增x但返回前一个值,因此在递归调用中它永远不会递增,并且您永远不会达到基本情况。就像一个无限循环。您必须将x++替换为++x以便提供任何结果,即使它不是正确的。 ++x正在修改x,因此它将改变x + recSum的最终总和。你最好使用:

return x + recSum(x + 1, max);

请参阅What is the difference between ++i and i++?

答案 2 :(得分:1)

看来你的意思是以下

int recSum(int x, int max)
{
    return max < x ? 0 : x + recSum( x + 1, max );
}

或者,更好地声明函数的返回类型,如long long int

long long int recSum(int x, int max)
{
    return max < x ? 0 : x + recSum( x + 1, max );
}

该功能可以像

一样调用
printf( "%lld\n", recSum( 4, 7 ) );

至于你的功能,它会在第一次调用中退出

int recSum(int x, int max)
{
    int incrementalSum = 0;
    recCall: if (x < max)
    return incrementalSum;
    ^^^^^^^^^^^^^^^^^^^^^

因为通常在x小于max时调用它。所以这个功能没有意义。此外,该函数不是递归的,因为它不会调用自身。