【问题标题】:C++ Recursion Help Using Horner's Method For computiing Polynomials使用 Horner 方法计算多项式的 C++ 递归帮助
【发布时间】:2013-04-17 13:03:08
【问题描述】:

到目前为止,这是我的代码。因为我一直得到一个不正确的答案,所以似乎有什么问题。我正在编写一个格式化的文本文件: 2 3.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 的想法

【问题讨论】:

  • 一个额外的错误。 polyeval 应该返回一个 double,而不是一个 int。
  • 谢谢...然后将 double polyeval() 声明为函数而不是 int polyeval() 是否有意义?
  • 是的,这正是我的意思,结果和返回类型都应该是双倍的。 (虽然你并没有真正使用结果,它可以被删除)
  • 是的,我删除了结果,因为 tacp 提示我在下面做

标签: c++ recursion


【解决方案1】:

胡乱猜测

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

【讨论】:

    【解决方案2】:

    这里有一个错误:

    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 = 24 时返回 2304,当它应该返回 27 给定 arraySize 2 和 array[o] = 3.0 和 array[1] = 1.0(正在读入)
    • 我相信我是从低阶存储到高阶,我猜这确实意味着它是以相反的顺序存储的,因为不会将 1.0 作为 polyarray[0] 和 3.0 作为 polyarray[1] 而不是反之亦然?
    • @user2289029 我认为这个问题是因为你正在访问数组之外​​的东西,因为数组索引从 0 开始。所以 polyarray[arraysize] 将超出范围。试试我更新的帖子?
    • 这次更接近它返回 96 作为我的解决方案。我认为我的 horners 规则的逻辑是正确的,有没有办法在我的 eclipse 编译器中出错?
    • return polyarray[arraySize-1]+ (x* (polyeval(polyarray,x,arraySize-1))); //这个改变似乎对我有用,显然我的逻辑是错误的
    【解决方案3】:

    问题主要在于多项式系数的定义。 您的代码采用以下形式的多项式:

    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) ... + p1 x + p0

    【讨论】:

    • 当我这样做时,结果变成了 0。
    • 请试试我更正后的建议,告诉我你得到了什么。
    • return polyarray[arraySize-1]+ (x* (polyeval(polyarray,x,arraySize-1))); //将我的代码更改为此似乎对我有用我认为这就是您所描述的我不太清楚 pow(x,arraySize) 在您的代码中做了什么?
    • 我现在明白了。我将多项式评估为 sum(ai * x^i) 而不是您希望做的霍纳规则。但是,您的原始代码的问题是您在第一次 x 乘法之前将 a[0] 和 a[1] 相加。您的更正似乎是正确的。恭喜:)
    【解决方案4】:

    无法准确确定您要执行的操作,或者您使用递归的原因。所以我创建了一个非递归版本,它似乎给出了正确的结果。

    #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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      相关资源
      最近更新 更多