【C | recursion】☞ 递归 之 自然数求和

88 阅读2分钟

☞ 【自然数求和】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;  
}

总结

  • 使用了 递归技术
  • 不断优化代码
    • 优化二 迭代就是常用方法循环
  • 优化
    • 栈溢出问题
    • 时间复杂度
    • 计算量
    • 响应速度/效率
    • 资源利用率