Java 线性递归是如何工作的?

Java 线性递归是如何工作的?,java,recursion,Java,Recursion,我编写了一个java程序,使用线性递归在数组中添加元素。获得的输出不符合预期。有人能指出这个程序有什么问题吗 public class TestSum { public int count = 0; public int sum(int[] a){ count++; if(a.length == count){ return a[count -1]; } return sum(a)

我编写了一个java程序,使用线性递归在数组中添加元素。获得的输出不符合预期。有人能指出这个程序有什么问题吗

public class TestSum {

    public int count = 0;


    public int sum(int[] a){

        count++;

        if(a.length == count){
            return a[count -1];
        }

        return sum(a) + a[count -1] ;
    }

    public static void main(String[] args) {

        int[] a = {1,2,3};

        int val = new TestSum().sum(a);
        System.out.println(val);
    }

}
我希望输出为6,但得到的是9。怎么了


奇怪的是,如果我改变加法的顺序,即
返回一个[count-1]+和(a)然后它以6的形式给出输出一般来说,不可重入(即依赖外部状态)的递归程序是可疑的。在您的特定情况下,
count
将在调用
sum
之间发生变化,使行为难以跟踪,最终导致您观察到的错误

您应该将索引与数组一起传递以使其正常工作:

// The actual implementation passes the starting index
private static int sum(int[] a, int start){
    if(a.length == start){
        return 0;
    }
    return sum(a, start+1) + a[start];
}
// Make sure the method can be called with an array argument alone
public static int sum(int[] a) {
    return sum(a, 0);
}

与增加方法外部计数的实现不同,此实现可以在多个线程上同时调用而不会中断。

“奇怪的是,如果我更改加法顺序,即返回[count-1]+和(a);然后它将输出为6。”你为什么觉得奇怪?我觉得很奇怪,因为只有通过改变加法的顺序,输出才会改变。我的意思是2+3和3+2是一样的。我肯定我对递归的理解是错误的,我试图找出相同的答案,但你没有在这里添加常量
sum(a)
更改
count
的值,从而更改
a[count-1]
。同意您的答案,但仍然不明白为什么在外部声明count时容易出错?@user001,因为您无法自由引用
count
,而不考虑如何通过自己方法的递归调用修改它。第
行上
count-1
的值返回一个[count-1]
返回和(a)+a[count-1]
是不同的,因为它们之间有一个对
sum(a)
的调用。当您将调用状态保持在方法外部时,需要注意这类事情。