2017-03-04 63 views
-1

我在研究如何编程,并且最近一直在处理一个问题,该问题计算从最小值到最大值输入的2个数字的总数。例如,如果有人输入了数字4,7,则计算将是4 + 5 + 6 + 7 = 22。在C中编写递归函数

我试过我认为会是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

如果你打算写代码一样,如果它是20世纪70年代,至少使其可读。 –

+0

你的'goto'构造等价于'while(1){...}'循环。循环不是递归。 – emlai

+0

您是否想为练习目的编写一个递归/迭代解决方案?或者您不知道用于总结1-n中所有整数的公式? – MikeMB

回答

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++?

+0

你是男人!.... 现在的代码工作。 –

5

你的代码中有3点重要的问题

  1. 表达

    incrementalSum = x + x++; 
    

    是不确定的,read this for more information

  2. 你的函数不是递归的,递归函数调用它自己,直到条件发生在应该结束的地方。

  3. 同时指出,我不是非理性的“永远不要使用goto”,这也正是为什么有些反对使用goto人的意见。

+0

'goto'上的便条... – alk

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小于最大的叫法。所以这个功能没有意义。而且这个函数不是递归的,因为它不会调用它自己。

+0

卓越的观察,这完成了我的答案。我认为SO应该有一种方法来允许合并答案并分享用户中的赞扬和赞扬。 –