题目链接:6-2 多项式求值
一. 题目
- 题目
- 裁判程序样例
- 输入输出样例
- 限制
二、代码(递归实现)
- 代码实现
// 递归计算x的i次方
doublex_i(double x ,int i) {
if (i > 1) {
return x*x_i(x, i-1);
} else if (i == 1) {
return x;
} else {
return 1;
}
}
// 计算f(x)
double f(int n, double a[], double x) {
double num = 0;
for (int i = 0; i <= n; i++) {
num += a[i] * x_i(x, i); // 计算a[i] * x的i次方,并求和
}
return num;
}
- 提交结果
三、代码(非递归实现)
- 代码
// 计算x的i次方
doublex_i(double x ,int i) {
double result = 1;
while (i > 0) {
result *= x;
i--;
}
return result;
}
// 计算f(x)
double f(int n, double a[], double x) {
double num = 0;
for (int i = 0; i <= n; i++) {
num += a[i] * x_i(x, i); // 计算a[i] * x的i次方,并求和
}
return num;
}
- 提交结果
四、代码(最终实现)
- 代码
double f(int n, double a[], double x) {
double fx = a[0];
double x_i = 1;
for (int i = 1; i <= n; i++) {
x_i *= x;
fx += a[i] * x_i;
}
return fx;
}
- 提交结果
五、总结
- 测试点2说明了递归或循环并不能解决计算量过大的时长问题,这时候需要考虑优化算法,单纯的改递归为非递归并不可行
- 有时候,需要跳出原本的思路,换一种实现1
做这道题时一心想着用递归实现,走了弯路;发现超时后只是单纯的跟换了计算X的I次方,在弯路上走的更远了 ↩︎