C++用函数递归求1+2+到n的问题

#include<iostream.h>
int sum(int n)
{
int t=0;
if(n<1) t=0;
else t=n+sum(n-1);//观察得出,这里外面的n与sum函数参数里面的n并不同步改变,比如下面主函数语句输入3,则t=3+sum(3-1)得t=n(3)+n(2)=5,然后t(5)=n(5)+sum(2-1)得t=n(5)+n(1)=6,这时上面if语句判断的n是第一个累加的n还是函数参数里的n呢?如果是函数参数里的n,那当t(6)=n(6)+n(0),不就满足上面if语句n<1了?这样最终仍然不会返回想求的和,而是t=0啊?请朋友们清楚的解释下,感谢了!
return t;
}
void main()
{
int a,z;
cout<<"请输入一个数,系统将自动求和:";
cin>>a;
z=sum(a);
cout<<z<<endl;
}
但是最终会返回累加和,我就是不明白为什么可以避免t=0,感觉应该函数里的n减到1就不会减下去而是return出累加和了,但是到底是根据什么不用继续将n减到0而跳出循环得出累加和的?? (程序运行结果都没问题)

其实这里定义了t是多余的。
这个函数可以这样写:
int sum(int n)
{
if(n<1) return 0;
else return n+sum(n-1);
}
其实递归调用是这样的。如n=3,第一次调用sum(n),n>=1 所以执行return n+sum(n-1),在函数返回之前,先会计算sum(n-1)……最后sum(0)=0,然后再一层一层的返回。最后会返回5了。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-08-12
你上面说t(6)=n(6)+n(0);我搞不懂,t,n不是函数,怎么能这么表示呢?
n和t都是sum()函数的局部变量。要注意的是每一层的sum()的n和t都不一样。当执行到t=n+sum(n-1)时,函数调用上一层sum()函数。上一层函数的n等于刚才的函数中的n-1,就是形参复制实参,而这两个变量名可以相同,也可以不相同,无所谓的。
而在本函数中调用的n当然是本形参中的n,即使有一个全局变量也是n,这时也会被屏蔽。
至于为什么以0为结束点,这个完全是可以的,当然,以1为结束点也可以。那就这样写:
int sum(int n)
{
if(n==1)
return 1;
else
return(n+sum(n-1));
}
结果应该是一样的。现在想想如果以0为结束点的话。
不过是此基础上最后多加了个0,这不影响结果的。
第2个回答  2010-08-12
进入一层递归,相当于进入一个新的空间,内部运算的结果只对内部负责,
对外返回一个对外的值

sum(3)的求解基于sum(2)的值,但不要把这里的3和2放到一个空间下去判断,这样会越来越糊涂

sum(3)=3+sum(2)这也是我们学习数学的概念吧,

当求出sum(2)时,你也同样不要考虑他和sum(1)和sum(0)的关系,只要
利用sum(2)的结果就可以了。本回答被提问者采纳
第3个回答  2010-08-12
因为sum函数里有个判断 if(n<1) t=0;,这在调用sum(1)时,就有t=1+sum(1-1),因为,1-1=0,这时,就返回t=0;。
相似回答