Linear Recursion如何工作?

时间:2016-09-01 16:59:48

标签: java recursion

我编写了一个java程序,使用Linear Recursion在数组中添加元素。获得的输出不是预期的。任何人都可以指出这个程序有什么问题吗?

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 。有什么问题?

奇怪的是,如果我更改添加顺序,即return a[count -1] + sum(a);,则输出为 6

1 个答案:

答案 0 :(得分: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);
}

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