2

在此处输入图像描述

这是我为解决上述系列而编写的 C++ 程序:

#include <iostream>
#include <cmath>
#include <cstdlib>
using namespace std;

int factorial(int a)
{
    if (a > 1)
        return a * factorial(a - 1);
    else
        return 1;
}

float series(float x, int n, float b)
{
    if (abs(pow(x, n) / factorial(n)) < pow(10, -6) || abs(pow(x, n) / factorial(n)) == pow(10, -6)) { return b; }
    else return b = (pow(x, n) / factorial(n)) + series(x, n + 1, b);
}

int main()
{
    float x;
    cout << "Enter x: "<<endl;
    cin >> x;
    cout << "E^x = " << series(x,0,0);
    system("pause");
    return 0;
}

当 abs(x) < 2 时它工作正常,但当 abs(x) >= 2 时出现此错误:

33b.exe 中 0x00F02539 处的未处理异常:0xC00000FD:堆栈溢出(参数:0x00000001、0x00F22FF8)。发生了 在此处输入图像描述

我想知道为什么会发生这种情况,我该如何解决?

4

2 回答 2

3

你的问题是递归太深了。改为考虑循环。

float series(float x)
{
    const float epsilon = 1e-6f;
    double error = 1;
    double res = 1.f;
    int iter = 1;
    while (abs(error) > epsilon) {
        error *= (x / iter++);
        res += error;
        cout << error << endl;
    }
    return res;
}

int main()
{
    cout << "E^x = " << series(3);
    system("pause");
    return 0;
}

为了更清楚地了解会发生什么:

当您在另一个函数中调用一个函数时,会保存父函数的上下文,以便为新上下文腾出空间。当您进行数百万次启动时,负责保存这些上下文的内存堆栈已满并溢出。

这是堆栈溢出。

于 2018-01-29T15:37:34.293 回答
1
 #include <iostream>
 #include <cmath>
 #include <cstdlib>
 using namespace std;
 int factorial[200];
 int Factorial(int a)
 {    if(a>0){
     factorial[a]=a * factorial[a-1];
         return factorial[a];
    }
    else
    factorial[a]=1;
    return 1;

 }

 double series(double x, int n, double b)
 {   double temp=(abs(pow(x, n)) / Factorial(n));
     if (temp <= 0.000001) { return b; }
     else return (temp + series(x, n + 1, b));
 }

 int main()
 {
     float x;
     cout << "Enter x: "<<endl;
     cin >> x;
     cout << "E^x = " << series(x,0,0);
     system("pause");
     return 0;
 }

嗯,这个解决方案有效。我所做的只是将您的代码删除 abs(pow(x, n) / factorial(n)) 重复并初始化为新变量 temp。然后代替 < || ==你可以直接放<=。而不是每次调用 aa 函数来计算 .000001 ,您可以只给出该值以进一步减少时间。但是我认为代码可能无法正常工作的原因是递归过多。所以对于阶乘,我使用动态编程来降低其复杂性。上面的代码工作得很好。

于 2018-01-29T15:44:34.417 回答