Java 线性递归是如何工作的?
我编写了一个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)
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)
的调用。当您将调用状态保持在方法外部时,需要注意这类事情。