递归函数变量初始化

时间:2017-11-12 15:58:08

标签: java recursion

编辑: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);
    }   

}

1 个答案:

答案 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循环计算而不进行任何递归,因此它无法使用递归的目的。