Java 从递归方法返回
我正试图练习理解递归,但下面的程序让我很为难。如何将答案返回为14?有人能告诉我这是怎么计算的吗?我试着加入一些打印语句来帮助我识别到底发生了什么,但我看不到spot在上升到4之后是如何减少的。我有下面的程序和输出到控制台,请帮助 从控制台:Java 从递归方法返回,java,Java,我正试图练习理解递归,但下面的程序让我很为难。如何将答案返回为14?有人能告诉我这是怎么计算的吗?我试着加入一些打印语句来帮助我识别到底发生了什么,但我看不到spot在上升到4之后是如何减少的。我有下面的程序和输出到控制台,请帮助 从控制台: The spot 1 is 0 The spot 1 is 1 The spot 1 is 2 The spot 1 is 3 The spot 1 is 4 when spot = length. the spot is 4 The value is
The spot 1 is 0
The spot 1 is 1
The spot 1 is 2
The spot 1 is 3
The spot 1 is 4
when spot = length. the spot is 4
The value is 4
spot after return 3
the spot 2 is 3
The value is 8
spot after return 2
the spot 2 is 2
The value is 11
spot after return 1
the spot 2 is 1
The value is 13
spot after return 0
the spot 2 is 0
The answer is 14
代码:
如果您的目标是编写一个对数组求和的方法,那么问题在于,在go()行中,If(numbers.length==spot)返回spot,即4,它将其添加到总值中(因为调用go(numbers,4)的方法将值设置为该值并将其相加),您应该返回0以停止递归(因为结果将是1+2+3+4+0) 试试这个尺码:
private int go(int[] numbers, int spot){
if(numbers.length == spot) return 0;
return go(numbers, spot+1) + numbers[spot];
}
到达终点后,尝试返回0而不是点。你把4(点的当前值)钉在末端。也许我可以帮你走过去。您的程序一直运行到调用go(number,3+1)为止,go返回4,因为number有4个元素,spot的值为4(3+1) 此时,您将看到如下内容的调用堆栈:
answer = go(stuff, 0);
value = go(numbers, 0 + 1);
value = go(numbers, 1 + 1);
value = go(numbers, 2 + 1);
value = go(numbers, 3 + 1) = 4
answer = go(stuff, 0);
go(stuff, 0) = go(numbers, 0 + 1) + 1;
go(numbers, 0 + 1) = go(numbers, 1 + 1) + 2;
go(numbers, 1 + 1) = go(numbers, 2 + 1) + 3;
go(numbers, 2 + 1) = go(numbers, 3 + 1) + 4;
go(numbers, 3 + 1) = 4;
现在它将工作,它的方式回到堆栈
go(numbers, 2 + 1 );
调用此函数将为您提供值+数字[3],即4+4,值来自go(数字,3+1)
接下来是
go(numbers, 1 + 1 );
这将返回go(数字,2+1)+数字[2],即8+3(或11)
然后调用go(数字,0+1),返回go(数字,1+1)+数字[1],即11+2或13
最后,可以计算go(stuff,0)。这将返回go(数字,0+1)+数字[0],即13+1或14-您当前得到的答案
我不确定我是否真的解释了很多,但希望通过浏览它可以显示出你的困惑所在
另一种可视化的方式是这样的:
answer = go(stuff, 0);
value = go(numbers, 0 + 1);
value = go(numbers, 1 + 1);
value = go(numbers, 2 + 1);
value = go(numbers, 3 + 1) = 4
answer = go(stuff, 0);
go(stuff, 0) = go(numbers, 0 + 1) + 1;
go(numbers, 0 + 1) = go(numbers, 1 + 1) + 2;
go(numbers, 1 + 1) = go(numbers, 2 + 1) + 3;
go(numbers, 2 + 1) = go(numbers, 3 + 1) + 4;
go(numbers, 3 + 1) = 4;
你的函数应该计算什么?这个问题给出了值的总和加上值的个数。你还没有说这是否是你想要的,所以我不得不说它以这种方式工作很好。我只是想确定这段代码在运行时做了什么,以及如何计算这些值。你能带我浏览一下我发布的代码并告诉我它在做什么吗?谢谢,有人能帮我确定这段代码在做什么吗。我不想更改代码中的任何内容。我想了解这个特定的项目是如何获得价值的。谢谢。请将每个方法调用视为一个值。所以,它说的是
go(number,0)
——这实际上是一个数字。是几号?好吧,那就是go(数字,1)+1
。那么,什么是去(数字,1)?它是go(数字,2)+2
。因此,我们的go(number,0)=go(number,2)+2+1
<代码>开始(数字,0)=开始(数字,3)+3+2+1<代码>开始(数字,0)=开始(数字,4)+4+3+2+1。最后,go(numbers,4)=0
因为numbers.length==spot
所以go(numbers,0)=0+4+3+2+1
=10.将上述对go(numbers,4)
的注释更改为原始代码的注释4(当spot==4
时,您正在调用return spot
),您将得到go(numbers,0)=4+4+3+2+1
=14。非常感谢。这正是我理解这一点所需要的。