我编写了一个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 。
答案 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);
}
与增加方法外部计数的实现不同,可以在多个线程上同时调用此实现而不会中断。