sggggr
sggggr
2018-01-25 09:09
采纳率: 66.7%
浏览 1.6k

请问这段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条回答 默认 最新

  • caozhy
    已采纳
     这里玩了两个花招。
    第一,把循环改成了递归。
    用数学归纳法表示就是:
    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) 
    }
    
    点赞 评论
  • mango_love
    mango_love 2018-01-25 09:11

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

    点赞 评论
  • qq_29306673
    有座城 2018-01-25 09:37

    首先你要明白什么是递归,这里边其实是有循环的,递归循环和迭代循环是两种思想。这里用到的就是递归。刚开始传入的参数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_37290266
    大夭 2018-01-25 09:54

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

    点赞 评论
  • starw2004
    starw2004 2018-01-25 14:30

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

    点赞 评论
  • Eleanor_He
    Eleanor_He 2018-01-26 01:44

    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

    点赞 评论
  • Eleanor_He
    Eleanor_He 2018-01-26 01:47

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

    点赞 评论
  • StackTc
    StackTc 2018-01-26 03:15

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

    点赞 评论
  • chshi0018
    chshi0018 2018-01-26 03:23

    用公式的话,当如下解,
    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

    点赞 评论
  • wenpinglaoyao
    纹枰老妖 2018-01-26 03:52

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

    点赞 评论

相关推荐