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



给定两个实数a, b (a <B)>和一个正整数

n。用牛顿-莱布尼茨公式计算定积分:a(上)∫b(下)(f(x,n)dx = f(b,n)-F(a,n)式中F(x,n)为一阶(不定积分、反导、本原函数、本原积分)函数F(x,n):F(x, n) = integral(F(x, n)dx)

以两种方式实现F(x,n)的计算:

  1. 作为递归的
  2. 作为非递归函数。

这就是需要解决的问题。点击链接打开照片。

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"

我的老师说:"你不能用幂函数,不管是标准的(功率)还是你自己的(功率)。"原因是,任何使用此类函数都会导致循环,而您的循环或标准函数中的循环都是细节。递归函数本身就是一个循环;使用可变增量会导致循环——效率不高。">

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;
}

你的老师可能希望你在迭代循环时动态地计算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

最新更新