C++ 使用霍纳方法计算多项式的递归帮助
C++ Recursion Help Using Horner's Method For computiing Polynomials
这是我到目前为止的代码。好像出了什么问题,因为我总是得到错误的答案。我写在一个文本文件的格式: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相关文章:
- 通过递归进行因子分解
- 递归函数计算序列中的平方和(并输出过程)
- 使用递归的数组的最小值.这是怎么回事
- 递归列出所有目录中的C++与Python与Ruby的性能
- 递归计数给定目录的文件和所有目录
- 如何在BST的这个简单递归实现中消除警告
- C++:正在检查LinkedList中的回文-递归方法-错误
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 递归无序映射
- TSP递归解的迭代形式
- 如何在Elixir中调用递归函数并行
- 返回递归调用和仅递归调用的区别
- 数组元素打印的递归方法
- 使用递归时获取变量的奇怪值
- 如何在C++中递归地按相反顺序打印集合
- 递归程序获得勒让德多项式
- 试图使用C 中的递归将类似的术语组合为模板多项式类别
- 多项式递归乘法
- 递归函数的分区,斯特林数,和切比雪夫多项式的第一
- C++ 使用霍纳方法计算多项式的递归帮助