☞ 【自然数求和】1-100之和
分析
问题分析:
- 自然数:非负整数!
- 求和
求和常用方法:
- 非递归
- 循环解决
- 递归
思路
循环解决
累加过程:1+2+3+...+n
int sum(int n){
int sum=0;
for(int i=1; i<=n; i++){
sum+=i;
}
return sum;
}
int main(){
int n = 100;
int res=sum(n);
return 0;
}
递归
大事化小。
限制条件:当 n=1时 递归停止。
解题
int sum(int n){
// int sum=0;
if(n<0){
return -1; // 输入有误
}
if(0==n|1==n){
return n;
}
return n+sum(n-1);
}
int main(){
int n = 100;
int res=sum(n);
return 0;
}
【optimization】 代码/思路 优化
优化一
#include <stdio.h>
// 使用一个基础情况来处理 n <= 1 的情况
int sum(int n) {
if (n < 0) {
return -1; // 输入有误,自然数...
}
if (n <= 1) { // 处理 0 和 1 的情况
return n;
}
return n + sum(n - 1); // 递归调用
}
int main() {
int n = 100;
int res = sum(n);
if (res != -1) { // 检查是否因为输入错误而返回-1
printf("Sum from 1 to %d is: %d\n", n, res);
} else {
printf("Invalid input\n");
}
return 0;
}
- 优化点:
- 修正逻辑错误:将
0==n|1==n改为n <= 1,这样当n是 0 或 1 时,函数会正确返回n。
- 修正逻辑错误:将
优化二 👂 ☞ 进一步优化
递归的缺点/问题在于栈溢出 和 系统开销大 。
避免递归调用的开销,提高代码效率:采用迭代替代递归来计算累加和
int sum(int n){
int result = 0;
if (n < 0) {
return -1; // 输入有误 (自然数)
}
for (int i = 1; i <= n; i++) {
result += i;
}
return result;
}
int main() {
int n = 100;
int res = sum(n);
if (res != -1) {
printf("Sum from 1 to %d is: %d\n", n, res);
} else {
printf("Invalid input\n");
}
return 0;
}
迭代和递归的区别在于 详情路径:【C | recursion && iteration】the differences of recursion && iteration - 掘金 (juejin.cn)
优化三🌂 ☞ 再次优化
利用数学公式--- 高斯求和
n * (n + 1) / 2
#include <stdio.h>
// 使用数学公式计算从1到n的和
int sum(int n) {
if (n < 0) {
return -1; // 输入有误
}
// 使用高斯求和公式
return n * (n + 1) / 2;
}
int main() {
int n = 100;
int res = sum(n);
if (res != -1) {
printf("Sum from 1 to %d is: %d\n", n, res);
} else {
printf("Invalid input\n");
}
return 0;
}
总结
- 使用了 递归技术
- 不断优化代码
- 优化二 迭代就是常用方法循环
- 优化
- 栈溢出问题
- 时间复杂度
- 计算量
- 响应速度/效率
- 资源利用率