递归函数; “......已停止工作”

时间:2017-11-20 19:31:24

标签: c

我正在尝试制作一个程序,给出一个特定的总和,直到我定义的某个点,这里是:

float sum(int n,float m);

main(void) {
    float a,m=1.0;
    int n;
    scanf_s("%ld", &n);
    a = sum(n, m);
    printf("%f", a);
}

float sum(int n, float m) {
    if ((n/m) < 0.0005) {
        return 0;
    }
    else {
        return n/m + sum(n, m + 2);
    }
}

(请注意,我定义的点是0.0005)当我给出一个大于或等于5的值时,程序会给我这个错误:

  

......已停止工作

此外,当我将定义的点增加到0.5时,我可以给出的值的数量也会增加。为什么你认为这种情况发生了,我该如何解决呢?

1 个答案:

答案 0 :(得分:1)

%ld scanf_s格式说明符需要long int *参数。你传入的是int *。这些类型不兼容。使用错误的格式说明符会调用undefined behavior,在这种情况下会显示为崩溃。

int *的正确格式说明符为%d

scanf_s("%d", &n);

编辑:

您看到的崩溃可能是堆栈溢出。 sum函数将递归调用自身1000 * n次。我在MSVC下看到了类似的错误,但是有不同的限制。你可以通过迭代解决方案解决这个问题:

float sum(int n, float m){
  float result = 0;
  while ((n/m) >= 0.0005){
    result += n/m;
    m+=2;
  }
  return result;
}