我正在研究如何编程并且最近一直在研究一个问题,该问题计算从最小到最大的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 */
*上面显示了新代码,抱歉,我使用了错误的代码。
答案 0 :(得分:5)
您的代码有3个重要问题
表达式
incrementalSum = x + x++;
你的函数不是递归的,递归函数会调用它直到条件发生它应该结束的时候。
另外,注意到我不是一个非理性的" 永远不会使用goto
人",这正是为什么有些人反对使用goto
的建议。
答案 1 :(得分:2)
您的代码无法正常工作的原因是:
return x + recSum(x++, max);
x++
递增x但返回前一个值,因此在递归调用中它永远不会递增,并且您永远不会达到基本情况。就像一个无限循环。您必须将x++
替换为++x
以便提供任何结果,即使它不是正确的。 ++x
正在修改x,因此它将改变x + recSum
的最终总和。你最好使用:
return x + recSum(x + 1, max);
答案 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时调用它。所以这个功能没有意义。此外,该函数不是递归的,因为它不会调用自身。