有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java递归函数变量初始化

编辑: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) 个答案

  1. # 1 楼答案

    看起来每个递归调用都应该在一个较小的数组上运行。如果不能将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);
        }   
    }
    

    另外,这两种递归方法是等价的。 对于您建议的输入(a={2,1,-2,6,4,3},x=3),两者都给出相同的结果-1202.0。然而,第二种方法对于递归实现更有意义。第一个循环可以用一个简单的for循环来计算,而不需要任何递归,因此它违背了使用递归的目的