Java 递归函数变量初始化

Java 递归函数变量初始化,java,recursion,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;

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

}

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

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循环来计算,而不需要任何递归,因此它无法达到使用递归的目的。

您不能在调用函数的地方初始化sum和i吗?你可以创建一个包装器方法,在这里你设置和,然后调用它。你可以使用额外的函数吗?@LuaiGhunim简短回答不,虽然如果我这样做不会是世界末日。@Christian很可能,但我是一个初学者,我甚至不知道那会是什么样子。我需要做一些谷歌搜索。令人印象深刻和优雅的解决方案!关于System.arraycopy,我只有一个小问题(对不起,我是个初学者)。为什么我们需要指定subArray.length值?我已经阅读了一个描述,我理解它只是函数的一部分,但是如果您在前一行代码中指定了子数组长度,那么这些信息不是多余的吗?再次感谢@doom01
System.arraycopy
需要源数组和目标数组中的开始索引,以及要复制的元素数。它不一定会填充目标数组。
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);
    }   
}