[英]C++ Recursion Help Using Horner's Method For computiing Polynomials
到目前為止,這是我的代碼。 由於我不斷收到錯誤的答案,因此似乎有些錯誤。 我正在編寫以下格式的文本文件: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
粗魯的猜測
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)... + p1 x + p0
無法確切計算出您要執行的操作或使用遞歸的原因。 因此,我提出了一個非遞歸版本,該版本似乎給出了正確的結果。
#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;
}
您可以看到它在這里運行:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.