C++ 使用霍纳方法计算多项式的递归帮助

C++ Recursion Help Using Horner's Method For computiing Polynomials

本文关键字:多项式 递归 帮助 计算 方法 C++      更新时间:2023-10-16

这是我到目前为止的代码。好像出了什么问题,因为我总是得到错误的答案。我写在一个文本文件的格式:23.0 1.0

2是数组的大小,然后3.0和1.0是系数。希望我的解释没有漏掉什么。任何帮助都将非常感激。由于

double polyeval(double* polyarray, double x, int arraySize)
{
    //int result = 0;
    if(arraySize == 0)
    {
        return polyarray[arraySize];
    }
    //result += x*(polyarray[arraySize]+polyeval(polyarray,x,arraySize-1));
      return polyarray[arraySize-1]+ (x* (polyeval(polyarray,x,arraySize-1)));
       //return result;
}
int main ()
{
    int arraySize;
    double x;
    double *polyarray;
    ifstream input;
    input.open("polynomial.txt");
    input >> arraySize;
    polyarray = new double [arraySize];
    for (int a = arraySize - 1; a >= 0; a--)
    {
        input >> polyarray[a];
    }
    cout << "For what value x would you like to evaluate?" << endl;
    cin >> x;
    cout << "Polynomial Evaluation: " << polyeval(polyarray, x, arraySize);
    delete [] polyarray;
}

的想法是,如果我在文本文件的格式变化大小它将解决任何值x由用户

随便猜一下

for (int a = arraySize - 1; a >= 0; a--)
//                            ^^
{
    input >> polyarray[a];
}

这里有一个错误:

for (int a = arraySize - 1; a > 0; a--)
{                             //^^should be a >=0 
    input >> polyarray[a];
}

您这样做少了一些条目。

递归函数应该如下所示:

int polyeval(double* polyarray, double x, int arraySize)
{
   if(arraySize == 1)
   {
      return polyarray[arraySize-1];
   }
   return x*(polyarray[arraySize-1]+polyeval(polyarray,x,arraySize-1));
}

问题主要在于多项式系数的定义。您的代码假设多项式的形式为:

x( p(n) + x( p(n-1) + x( p(n-2) + ... x(p(1) + p(0)))..))
这条线

:

result += x*(polyarray[arraySize]+polyeval(polyarray,x,arraySize-1));

应该成为:

result += pow(x,arraySize)*polyarray[arraySize]+polyeval(polyarray,x,arraySize-1);

这样多项式就被正确定义为p(n)x^n + p(n-1)x^(n-1)…

无法确定您要做什么,或者为什么要使用递归。所以我做了一个非递归的版本,它似乎能给出正确的结果。

#include <iostream>
using namespace std;
double polyeval(const double* polyarray, double x, int arraySize) {
    if(arraySize <= 0) { return 0; }
    double value = 0;
    const double * p = polyarray + (arraySize-1);
    for(int i=0; i<arraySize; ++i) {
        value *= x;
        value += *p;
        p--;
    }
    return value;
}
int main () {
    const int arraySize = 3;
    const double polyarrayA[3] = {0.0,0.0,1.0}; // 0 + 0 x + 1 x^2 
    const double polyarrayB[3] = {0.0,1.0,0.0}; // 0 + 1 x + 0 x^2 
    const double polyarrayC[3] = {1.0,0.0,0.0}; // 1 + 0 x + 0 x^2
    cout << "Polynomial Evaluation A f(x) = " << polyeval(polyarrayA, 0.5, arraySize)<<std::endl;
    cout << "Polynomial Evaluation B f(x) = " << polyeval(polyarrayB, 0.5, arraySize)<<std::endl;    
    cout << "Polynomial Evaluation C f(x) = " << polyeval(polyarrayC, 0.5, arraySize)<<std::endl;    

}

你可以看到它在这里运行:

http://ideone.com/HE4r6x