c语言用递推的方法求1+2+3...+n的和
我的刚接触c,很多不懂得地方,谢谢大家指教
2018-11-09 17:00
程序代码:
#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;
}

2018-11-09 18:02
程序代码:#include<stdio.h>
int add(int n)
{
if(n<=1) return 1;//结束条件
else return (add(n-1)+n);
}
int main()
{
printf("%d",add(100));
return 0;
}

2018-11-09 18:14