/*不用任何循环语句,不用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;
}
//哪个大神能讲明白这段程序?
这里玩了两个花招。
第一,把循环改成了递归。
用数学归纳法表示就是:
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)
}
n*(n+1)/n,直接用公式就行了,希望能够帮到您
首先你要明白什么是递归,这里边其实是有循环的,递归循环和迭代循环是两种思想。这里用到的就是递归。刚开始传入的参数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,就这个逻辑就可以一步步的进行下去了,主要是要理解递归和逻辑与的用法。
其实需要先弄清楚栈数据的存放规则。
第一次进add(int c)时的临时变量a和形参c都有各自存放的空间。如a存放于位置1,c存放于位置2。
而add(int c)中内部第二次调用add(int c)时,会分配新的区间给新的a和新的c。如a2存放于位置3,c2存放于位置4。
因此虽然看起来是同样的a和同样的c,每一层函数的临时变量和参数都是有自己的单独存放位置的。
n*(n+1)/n,直接用公式,就这么简单
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语言,这是一个递归求和的方法,题主懂递归的意思吗?