练习:用递归、循环和数学公式计算1到100的和
1.递归算1到100的和
比如本题,计算1到100的和,
可以分割成
- 第一步:计算1 + 2
- 第二步:计算(1 + 2)+ 3
- 第三步:计算(1 + 2 + 3)+ 4
- ....
- 最后一步:计算(... + 99)+ 100
也可以分割成
- 第一步:计算100 + 99
- 第二步:计算(100 + 99)+98
- 第三步:计算(100 + 99 + 98)+ 97
- ...
- 最后一步:计算(... + 2)+ 1
每一步实际上都是“前一步的结果 + 当前数字”,算法是两个参数相加,
随着"当前数字"越来越大(从1加到100)或越来越少(从100加到1),分割的问题规模逐步缩小,最终达到终止条件(如:只剩1个数相加时)。这就构成了递归。
递归的基本要素
1.递归条件(递归调用)
问题被分解,函数调用自身去处理更小的问题
2.终止条件(基线条件/边界条件)
当问题足够简单时,不再递归,而是直接给出结果,防止无限循环。
以本题为例,从1加到100,终止条件:当前数等于100;递归条件:当前数少于100。
void Main() { Sum(1, 100).Dump(); } private int Sum(int start, int end) { if(start == end)//终止条件 return end; else return start + Sum(start + 1, end);//递归条件 } //以 Sum(1, 3) 为例: //Sum(1, 3) //→ 1 + Sum(2, 3) //→ 1 + (2 + Sum(3, 3)) //→ 1 + (2 + 3) //→ 6 //Sum(1, 100) 的实际计算 //Sum(1, 100) //→ 1 + Sum(2, 100) //→ 1 + (2 + Sum(3, 100)) //→ ... //→ 1 + 2 + 3 + ... + 100 //→ 5050
从100加到1,终止条件:当前数等于1;递归条件:当前数大于1;
void Main() { Sum(1, 100).Dump(); } private int Sum(int start, int end) { if(end == start)//终止条件 return start; else return end + Sum(start, end - 1);//递归条件 } //Sum(1, 100) //→ 100 + Sum(1, 99) //→ 100 + 99 + Sum(1, 98) //→... //→100 + 99 + ... + Sum(1, 1)
2.循环实现1加到100
int sum = 0; for (int i = 0; i <= 100; i++) { sum += i; } sum.Dump(); =========================================== int sum1 = 0; int i1 = 1; while(i1 <= 100) { sum1 += i1; i1++; } sum1.Dump();
3.数学公式实现1加到100
void Main() { Sum(100).Dump(); } private int Sum(int n) { return (1 + n) * n / 2; }
浙公网安备 33010602011771号