问题描述:计算sum(n)=1+2+3+…+n
输入:该输入将由一系列的n个整数,每一个整数。
输出:对于每种情况,输出和(n)中,用一个空行。你可以假定该结果为32位带符号整数。
样本输入:1100
样本输出:15050
以上为原题,但是具体理解之后,可以发现,本体和1000题一样,是默认的循环输入,并且要做到循环输出。每次输入一个整型 num的值,程序会自动计算num+(num-1)+(num-2)+...+3+2+1的值,并返回回来。
因为今天看到了迭代的方法,所以开始时,我使用了迭代的方法来写本题。
#include<iostream>
int Sum(int num)
{
<span style="white-space:pre"> </span>if (num == 1)//基准情形
<span style="white-space:pre"> </span>return num;
<span style="white-space:pre"> </span>else
<span style="white-space:pre"> </span>{
<span style="white-space:pre"> </span>num = num + Sum(num - 1);//递归时,必须要能够逐层向下,所以,Sum中的值必须不断变化,代码前进段。
<span style="white-space:pre"> </span>return<span style="white-space:pre"> </span>num;//递归达到基准情形之后,需要有递归返回段。根据下层返回的值,对上层的值产生影响。
<span style="white-space:pre"> </span>}
}
int main()
{
<span style="white-space:pre"> </span>int num = 0;
<span style="white-space:pre"> </span>while (std::cin >> num)
<span style="white-space:pre"> </span>std::cout << Sum(num) << std::endl << std::endl;//题目要求,需要两个回车换行。
<span style="white-space:pre"> </span>return 0;
}
在Visual Studio 2015中可以正常运行,但是每次在HDOJ上提交的时候都会报错。
后来仔细看看发现了,Sum函数中else中没有使用return!
经过修改之后:
#include<iostream>//使用用输入输出流
int Sum(int num)//计算总数的函数
{
if (num == 1)
return num;//
else
return (num + Sum(num - 1));//在此处,加上了return,使用了迭代。
}
int main()
{
int num = 0;//用于接收输入的值
while (std::cin >> num)//当成功输入数据时,“<span style="white-space: pre-wrap; font-family: "Courier New", Courier, monospace;">std::cin >> num</span><span style="white-space: pre-wrap; font-family: "Courier New", Courier, monospace;">”为true,while循环执行</span>
{
std::cout << Sum(num) << std::endl << std::endl;//调用Sum函数,并且直接输出Sum函数返回的结果
}
return 0;
}
在上面的代码调试成功之前,我为了让HDOJ能够通过,又写了一个代码提交,也粘在下面:
#include<iostream>
int main()
{
int a;
while (std::cin >> a)
{
int result = 0;
for (int i = a; i > 0; i--)
{
result += i;
}
std::cout << result << std::endl << std::endl;
}
return 0;
}
这个代码和上面的基本解题思想是相同的,都是累加,最后输出结果。
总结:写代码时要小心,往往越是小的点,越容易出错,而且因为过于微小,所以就被忽视,从而检查不出来。
注:当在IDE中编写代码时,因为使用的是死循环,所以总是无法正常退出,在windows系统中,输入文件结束符的方法是敲Ctrl+Z,然后按Enter键。在UNIX系统中,包括Mac OS X系统中,文件结束符输入时用Ctrl+D。
递归简论:
1、基准情形。在递归中,必须要有基准情形,他们不用递归就能求解。
2、有递归前进段。递归不断深入的部分。
3、递归返回段。当基准情形出现之后,能够再往外层返回答案的部分。
4、不断推进。对于那些需要递归求解的情形,递归调用必须总能够朝着基准情形的方向推进。