编辑:sum和i的初始值应为0.
我收到了一个需要使用递归的任务。目前代码不会运行,因为我没有初始化变量“sum”和“i”。
有没有人对如何在不向evalHornerRec方法添加额外参数的情况下完成任务有任何想法?
// example data: a = {2, 1, -2, 6, 4, 3}, x = 3
public static double evalHornerRec(double[] a, double x)
{
int len = a.length;
int i;
double sum;
if (i >= len)
{
return sum;
}
else
{
sum += a[i] * Math.pow(x, i);
i++;
return evalHornerRec(a, x);
}
}
答案 0 :(得分:3)
看起来每个递归调用都应该在较小的数组上运行。如果您不能将i
作为参数添加到递归调用中,则可以传递子数组而不是完整数组。
对于sum
,我假设应该是方法返回的值,所以我假设您应该将递归调用的结果添加到当前调用中添加的术语。
public static double evalHornerRec(double[] a, double x) {
int len = a.length;
if (len <= 0) {
return 0.0;
} else {
double[] subArray = Arrays.copyOf(a,len-1);
return evalHornerRec(subArray, x) + a[len-1] * Math.pow(x, len-1);
}
}
编辑:我的答案基于你在问题中的表现,但基于this description of Horner's method,你应该计算的递归实际上是:
evalHornerRec(a,x) = a[0] + x * evalHornerRec (sub array of a[1] to a[n-1])
看起来像这样:
public static double evalHornerRec(double[] a, double x) {
if (a.length == 1) {
return a[0];
} else {
double[] subArray = new double[a.length - 1];
System.arraycopy(a, 1, subArray, 0, subArray.length);
return a[0] + x * evalHornerRec(subArray, x);
}
}
P.S。,这两种递归方法是等价的。
对于您建议的输入(a = {2,1,-2,6,4,3},x = 3),两者都给出相同的结果 - 1202.0
。但是,第二种方法对递归实现更有意义。第一个可以使用简单的for循环计算而不进行任何递归,因此它无法使用递归的目的。