Java 从递归方法返回

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

我正试图练习理解递归,但下面的程序让我很为难。如何将答案返回为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 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。非常感谢。这正是我理解这一点所需要的。