递归函数,使用牛顿-莱布尼茨公式计算定积分,C++

utugiqy6  于 2022-12-30  发布在  其他
关注(0)|答案(1)|浏览(142)

已知:两个真实的 a,b(a〈b) 和一个正整数

以两种方式实现F(x,n)的计算:
1.作为递归。
1.非递归函数。
这就是需要解决的问题,点击链接打开照片
F(x,n) = ∫(ctg^n*xdx)
我用 pow 函数解了这道题,老师让我不用 pow 函数解这道题,帮我不用 pow 函数解。
递归解

// Recursion
double F(double x, int n)
{
    if (n == 0)
        return x;
    else if (n == 1)
        return log(fabs(sin(x))); 
    else
        return -pow(cos(x) / sin(x), n - 1) / (n - 1) - F(x, n - 2);
}

使用循环求解

// For loop
double F_for(double x, int n)
{
    if (n == 0)
        return x;
    else if (n == 1)
        return log(fabs(sin(x))); 
    else
    {
        double F1 = x;
        double F2 = log(fabs(sin(x)));
        double res = 0.0;
        for (int i = 2; i <= n; i++)
        {
            res = -pow(cos(x) / sin(x), i - 1) / (i - 1) - F1;
            F1 = F2;
            F2 = res;
        }
        return res;
    }
}

主函数

int main()
{
    double a, b;

    cout << "Enter a: ";
    cin >> a;

    cout << "Enter b: ";
    cin >> b;

    int n;

    cout << "Enter n: ";
    cin >> n;

    cout << "Recursion: " << F(b, n) - F(a, n) << std::endl;

    cout << "A loop: " << F_for(b, n) - F_for(a, n);

    return 0;
}

请帮我解决这个问题,不要使用pow函数,我已经写了我的函数“my_power”。
我的指导员说:“你不能使用幂函数,无论是标准的(pow)还是你自己的(power),原因是任何使用这样的函数都会导致循环,而你的循环,或者标准函数中的循环,都是细节,递归函数本身就是循环;使用可变增量会导致循环--效率不高。”

double power(double x, int y)
{
    double temp;
    if (y == 0)
        return 1;
    temp = power(x, y / 2);
    if ((y % 2) == 0) {
        return temp * temp;
    }
    else {
        if (y > 0)
            return x * temp * temp;
        else
            return (temp * temp) / x;
    }
}

I also tested this function

void test_my_power()
{
    cout << "pow" << pow(2, -3) << "0" << endl;
    cout << "power" << power(2, -3) << "0" << endl;
    cout << endl;

    cout << "pow" << pow(0, -3) << "0" << endl;
    cout << "power" << power(0, -3) << "0" << endl;
    cout << endl;

    cout << "pow" << pow(0, 1) << "0" << endl;
    cout << "power" << power(0, 1) << "0" << endl;
    cout << endl;

    cout << "pow" << pow(0, -1) << "0" << endl;
    cout << "power" << power(0, -1) << "0" << endl;
    cout << endl;

    cout << "pow" << pow(8, 4) << "0" << endl;
    cout << "power" << power(8, 4) << "0" << endl;
    cout << endl;

    cout << "pow" << pow(11, 3) << "0" << endl;
    cout << "power" << power(11, 3) << "0" << endl;
    cout << endl;

    cout << "pow" << pow(5, 6) << "0" << endl;
    cout << "power" << power(5, 6) << "0" << endl;
    cout << endl;
}
2fjabf4q

2fjabf4q1#

您的老师可能希望您在迭代循环时动态计算pow
此代码:

const auto t = cos(x) / sin(x);

for(int i = 2; i <= n; ++i) {
   const auto val = pow(t, i - 1);
   ...
}

相当于:

auto power = t;

for(int i = 2; i <= n; ++i) {
   const auto val = power;
   ...
   power *= t;
}

并且不使用pow

相关问题