请问这段C++程序是怎样实现求和的?

C++ 程序,不能理解程序是怎样实现求和的,很简单的代码

/*不用任何循环语句,不用if,来实现1+2+3+...+10的值*/
#include
using namespace std;

int add(int c)
{
int a=0;
c&&(a=add(c-1));//递归循环,直到传入c的值为0则结束循环
cout<<c+a<<endl;
return c+a;
}
int main()
{
add(10);
return 0;
}
//哪个大神能讲明白这段程序?

10个回答

 这里玩了两个花招。
第一,把循环改成了递归。
用数学归纳法表示就是:
sum(0) = 0 //0的累加求和是0
sum(n) = n + sum(n - 1) //当 n > 0,对n的累加求和相当于n + (对n-1的累加求和)
写成程序就是
int add(int c)
{
if (c == 0) return 0;
return c + add(c - 1);
}
这个能理解吧。

然后这个程序玩了第二个花招,把if语句隐藏起来。
为了做到这一点,他用了&&符号。
&&就是逻辑and。and知道吧。比如a and b,那么只有a和b都是真,结果才是真,如果a是假的,那么无论b是真是假,逻辑表达式都是假的。
c++为了优化,如果左边表达式返回0,右边的表达式不会计算。
所以
c&&(a=add(c-1));
其实就是
if (c != 0)
a = add(c - 1);
else
a = a;
带入前面的程序
int add(int c)
{
int a = 0;
if (c == 0) a = a;
a = add(c - 1);
return a + c; //也就是return c + add(c - 1) 
}
qq_40457998
moo-520 楼下说的太完美了,我竟无言以对
接近 2 年之前 回复
qq_31279563
qq_31279563 牛人
接近 2 年之前 回复
caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复sggggr: 不好意思,我笔误 a = add(c - 1);前面少了 else
接近 2 年之前 回复
sggggr
sggggr 非常感谢您。讲的很明白。我仔细看了您的代码。我认为最后那一段的a=add(c-1);前提条件是c!=0,否则就无尽的循环了。“带入前面的程序”这行字之前的是对的。望您指点。
接近 2 年之前 回复
sggggr
sggggr 非常感谢您。讲的很明白。我仔细看了您的代码。我认为最后那一段的a=add(c-1);前提条件是c!=0,否则就无尽的循环了。“带入前面的程序”这行字之前的是对的。望您指点。
接近 2 年之前 回复
qq_40500571
qq_40500571 大佬,不敢吹水了
接近 2 年之前 回复
qq_29306673
有座城 这个比较透彻。很认真很有耐心。我偷懒了。。
接近 2 年之前 回复

首先你要明白什么是递归,这里边其实是有循环的,递归循环和迭代循环是两种思想。这里用到的就是递归。刚开始传入的参数C是10,执行到
c&&(a=add(c-1))时候,会调用add函数自己,传入的参数是c-1 即为9,同理,再次执行add函数,直到传入的参数为0时,执行到c&&(a=add(c-1))时候
C为假,所以不再执行a=add(c-1),执行下边的函数,此时a是0,c是0,c+a为0,返回值就是0,再回到当c=1的时候,c = 1,a=add(1-1)即a = add(0),
刚刚已经直到了add(0)返回值是0,那执行下一步c+a = 1,就这个逻辑就可以一步步的进行下去了,主要是要理解递归和逻辑与的用法。

qq_29306673
有座城 回复sggggr: 没事,你解决了问题就好了,我也是在学习阶段,一起互相学习。有啥不懂得你可以私信我问我就好了。
接近 2 年之前 回复
sggggr
sggggr 没有找到采纳多个答案的方法,抱歉抱歉
接近 2 年之前 回复
sggggr
sggggr 谢谢您,学到很多!!!
接近 2 年之前 回复
qq_29306673
有座城 回复sggggr: 要是初学的话先这么理解比较好理解。
接近 2 年之前 回复
qq_29306673
有座城 回复sggggr: 说没关系其实是有的,外层的C提供给内层C的值。这是一个很简单的按值传递的函数。其实也没有太大的关系的。里边函数执行不会改变外层C的值。
接近 2 年之前 回复
sggggr
sggggr 还想问一下外层的c和内层的c有什么关系吗?
接近 2 年之前 回复
qq_29306673
有座城 明白了吗?
接近 2 年之前 回复

n*(n+1)/n,直接用公式就行了,希望能够帮到您

chshi0018
chshi0018 个人理解,你的公式应该是这样,n*(n+1)/2
接近 2 年之前 回复
chshi0018
chshi0018 兄弟,你这个公式冒似是问题,
接近 2 年之前 回复
mango_love
mango_love 回复sggggr: 递归就是一个自己调用自己的过程,直到什么要求就不再调用自己了,就执行下一步。可以尝试调试下程序,跟着程序走一遍。
接近 2 年之前 回复
mango_love
mango_love 回复sggggr: 就是add(10)方法运行的时候,里面再去自己调用自己,调用的方法是add(9),这个方法再去调用自己,。。。这样一直下去,里面的开关就是0的时候就不再调用自己了
接近 2 年之前 回复
yujiaxucheng
yujiaxucheng 你很棒棒呢,哈哈哈,略简单粗暴!
接近 2 年之前 回复
sggggr
sggggr 还是不太明白怎么递归的。。
接近 2 年之前 回复
mango_love
mango_love 这段代码就是一个递归,10传进去进行计算,每次减少1,累加。。所以执行第一次add(10),第二次是add(9)...直到add(0),最后的执行是10+9+8+...+0
接近 2 年之前 回复

其实需要先弄清楚栈数据的存放规则。
第一次进add(int c)时的临时变量a和形参c都有各自存放的空间。如a存放于位置1,c存放于位置2。
而add(int c)中内部第二次调用add(int c)时,会分配新的区间给新的a和新的c。如a2存放于位置3,c2存放于位置4。
因此虽然看起来是同样的a和同样的c,每一层函数的临时变量和参数都是有自己的单独存放位置的。

add(10)
1)第一步:add(10) --> 10&&(a=add(9)) 返回 10+add(9)
2)第二步:add(9) --> 9&&(a=add(8) 返回 9+ add(8)
...
如此, add(10) = 10+add(9) = 10 + 9+add(8) ,不停递归调用,
最后结果为 10 + 9 + 8 +7 +6 +5 +4 +3 +2 +1 + add(0).
add(0) = c&&add(0-1);
注意这个地方了,此处是与&&操作,表达式1&&表达式2,先求解表达式1再求解表达式2,如果表达式1为false,则不再求解表达式2.
所以此处 add(0-1)因为左侧c为0结束求解,结束整个迭代。
最终add(10) = 10 + 9 + 8 +7 +6 +5 +4 +3 +2 +1 + add(0) = 10 + 9 + 8 +7 +6 +5 +4 +3 +2 +1 + 0

注意这个地方了,此处是与&&操作,表达式1&&表达式2,
先求解表达式1再求解表达式2,如果表达式1为false,则不再求解表达式2.
所以求解add(0)的时候,才能结束整个迭代。

递归思想 add(10) = 10 + add(9) = 10 + 9 + add(8) = 10 + 9 + 8 + add(7) = 10 + 9 + 8 +......0;
希望楼主能理解

用公式的话,当如下解,
n*(n+1)/2 而不是 n*(n+1)/n
假如,n=10,那么
s0=1+2+3+4+5+6+7+8+9+10=55
按错误的公式,假如,n=10,那么
n=10
s0=10*(10+1)/10=10*11/10=11

题主应该把这个问题归纳为C语言,这是一个递归求和的方法,题主懂递归的意思吗?

n*(n+1)/n,直接用公式,就这么简单

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!