c语言用递推的方法求1+2+3...+n的和
我的刚接触c,很多不懂得地方,谢谢大家指教
程序代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> /* 求 1 + 2 + 3 ...n 的和; */ /* 递归的思想分析下: 1到n,假设[1~n-1]的和我知道了,结果 + n = [1, n]到结果; ....依次类推,得到一个最小规模问题的解,那么我们后面所有的都知道了; */ // 随着函数调用,似的问题规模不断减少的同时,栈在往下面一直增加; // 直到遇到最小规模的问题得到解决,栈才不会增加了,才会一次返回; static int sum_value(int n) { if (n == 1) { // 问题规模最小 n = 1; return 1; } // 假设n-1规模问题得到解决,推导出n的问题规模的结构; int ret = sum_value(n - 1); // 递归调用 return (n + ret); // n-1,推导出n的结果 } // (1)假设小一级规模得到解决,推导出当前规模的问题解; // (2) 问题规模转化越来越小, 最小规模的问题,我们返回一个值, // (3) 随着问题规模的大小1000的,10000的,同样的代码对栈的消耗是不一样的 // (4) 对栈的消耗,不是鲁棒的; // 普通的算法,对栈的消耗不会随着问题规模的变化而变化; // 递归算法, 问题的规模越大,递归的次数越大,那么对栈的消耗就越大; // (5) 每个引用程序的栈的大小是固定的,你递归的时候层次不易过多,否则容易出现栈溢出; // (6) 解决规模不大的问题; // (7) 数学归纳法的思想,能够方便我们写出复杂的逻辑; // (8) 程序中栈的大小是可以由编译器来配置,那么编译出来的程序,就会使用你设置的栈的大小,默认是1M; // (9) 如果你实在要用递归,然而栈不够用,可以通过修改编译器来改变栈的大小; // (10) 栈是可以修改大小的, static int sum_value2(int n) { int sum = 0; for (int i = 1; i < n; i++) { sum += i; } return sum; } int main(int argc, char** argv) { // 1到5,和 1 + 2 + 3 + 4 + 5 int ret = sum_value(10000); printf("ret = %d\n", ret); system("pause"); return 0; }