user-0 提问: 大神给看看这个哪里错了。初学c

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-2
content: 你这个函数，写的有问题！ 而且，最后输出的应该是用“%f”，而不是“%d”

user: user-3
content: 30 #include <stdio.h>  29            28 int sum(int x)  27 {          26     if(x==1)  25     |   return 1;  24     else if(x==2)  23     |   return 2;  22     else   21     |   return sum(x-1) + sum(x-2);   20 }          19            18 int main(void)  17 {          16     int i;  15     int numerator, demonminator;      14     double total = 0.0;  13            12     //numerator list  11     for (i = 0; i < 20; i++) {  10     |   printf("%d\t", sum(i+1));      9     }       8     putchar(10);   7     //denominator list   6     for (i = 0; i < 20; i++) {    //分子序列   5     |   printf("%d\t", sum(i+2));      4     }       3     putchar(10);   2             1     for (i = 0; i < 20; i++) {    //分母序列 31      |   demonminator = sum(i+1);                                                                                                                                                                            1     |   numerator = sum(i+2);   2             3     |   total +=  numerator*1.0 / demonminator;   4     }       5     printf("total = %lf\n", total);    6     /*      7     int  i=1, j=2, n;   8     double a=0, b=0, c, d=0;   9     for(n=1; n<=20; n++)  10     {      11     |   a = a+sum(n);  12     |   b = b+sum(n+1);  13     |   c = b/a;  14     |   d += c;  15     |   i++;  16     |   j++;  17     }      18     printf("%d",d);  19 */         20     return 0;  21 }   主要是找到分子，分母与相加个数的关系；递归算法没问题，我直接使用了； 这个问题主要是在找到规律，找到其中的算法，这个是重点；所以说，编程都是数学问题；

user: user-4
content: # include <stdio.h>  int sum(int x) {   if(x==1) return 1; else if(x==2) return 2;      else  return sum(x-1)+sum(x-2); } int main() { int  i=1, j=2, n; double a=0, b=0, c, d=0; for(n=1;n<=20;n++) {a=sum(n); b=sum(n+1); c=b/a; d+=c; } printf("%.4f",d); return 0; } 根据你的方法改的

user: user-5
content: 你的程序中需要修改的：  int main() { int  i=1, j=2, n; double a=0, b=0, c, d=0; for(n=1;n<=20;n++) {a=a+sum(i);i++;   <==== a = sum(i); i++; b=b+sum(j);j++;    <==== b = sum(j); j++; c=b/a; d+=c;  } printf("%d",d);    <==== printf("%f",d); return 0; }

user: user-6
content: #include <stdio.h> #include <stdlib.h>  int main() {     double a = 1, b = 2, sum = 0, c;     int i;      for ( i=0; i<20; i++ )     {         sum += b / a;         c = b;         b += a;         a = c;     }     printf("%f ", sum);     return 0; }   哪有这么麻烦。

user: user-7
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-8
content: 不知道你看过递归没有？看一下斐波那契数列会有帮助

user: user-9
content: 感觉看你代码逻辑好复杂，我自己写了个。 double GetSum(float n1, float n2, int nCalTimes) { 	double sum = 0; 	if (nCalTimes-- <= 0) 	{ 		return sum; 	} 	sum += (n2 / n1); 	return sum += GetSum(n2, n1 + n2, nCalTimes); }  int main() { 	std::cout << GetSum(1, 2, 20) << std::endl; // 32.6603 	getchar(); 	return 0; }