2011-11-07 63 views
-2

我试图理解递归,但下面的程序让我难堪。答案如何以14返回?有人能告诉我这是如何计算的吗?我试图列出所有的打印语句,以帮助我确定发生了什么,但是我没有看到在点数增加到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 

代码:

public class Recurs1 { 
    public static void main (String [] arg) { 
     Recurs1 r = new Recurs1(); 
     r.compute(); 
    } 

    public void compute() { 
     int [] stuff = {1, 2, 3, 4}; 
     int answer = go(stuff, 0); 
     System.out.println("The answer is " + answer); 
    } 

    private int go(int[] numbers, int spot) { 
     System.out.println("The spot 1 is " + spot); 
     //System.out.println("0 is " + numbers[0] + " 1 is " + numbers[1] + " 2 is " + numbers[2] + " 1 is " + numbers[3]); 
     if (numbers.length == spot) { 
      System.out.println("when spot = length. the spot is " + spot); return spot;  
      } 
     int value = go(numbers, spot + 1); 
     System.out.println(" The value is " + value); 
     System.out.println("spot after return " + spot); 
     System.out.println(" the spot 2 is " + spot); 
     return value + numbers[spot]; 
    } 

} 
+2

你有什么功能应该算? – xthexder

+0

问题给出了数值加上数值的总和。你没有说过这是否是你想要的,所以我不得不说这样做很好。 –

回答

0

如果你的目标是编写该求和阵列的方法,那么问题是,在走线(),其中你有if(numbers.length == spot)你正在返回spot,它是4,并且它将这个值添加到总值中(因为调用go的方法(数字,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

我只是试图确定这个确切的代码在做什么,以及如何计算值。你可以通过我发布的代码来引导我,并告诉我它在做什么?谢谢, – user994602

+0

可以somone请帮我确定这段代码在做什么。我不想在代码中改变任何东西。我想了解这个特定程序如何获得其价值。谢谢。 – user994602

+0

将每个方法调用看作一个值。所以,它说'去(数字,0)' - 这实际上是一个数字。它是什么数字?那么,那就是'去(数字,1)+ 1'。那么,'go(数字,1)'是什么?它是'去(数字,2)+ 2'。所以,我们的价值'go(numbers,0)= go(numbers,2)+ 2 + 1'。 go(numbers,0)= go(numbers,3)+ 3 + 2 + 1'。 go(numbers,0)= go(numbers,4)+ 4 + 3 + 2 + 1'。最后,'go(numbers,4)= 0'因为'numbers.length == spot',所以'go(numbers,0)= 0 + 4 + 3 + 2 + 1'。 = 10. – Tim

2

尝试当你到达终点返回0,而不是现货。你正在把4(当前值的现货)加到尾声上。

0

也许我可以帮你引导你。你的程序一直工作直到它调用go(数字,3 + 1),这会返回4,因为数字有4个元素,点的值是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 

现在,它的工作它的方式备份栈。

go(numbers, 2 + 1); 

调用这会给你值+数字[3],这是4 + 4,用从去未来值(数字,3 + 1)。

接下来我们

go(numbers, 1 + 1); 

这将返回去(数字,2 + 1)+号码[2],它是8 + 3(或11)。

然后去(数字,0 + 1)被调用时,它返回去(数字,1 + 1)+号[1],这是11 + 2或13

最后,去(东西,0)可以被计算。这返回去(数字,0 + 1)+数字[0],这是13 + 1,或14 - 你正在得到的答案。

我不确定我是否真的解释了很多,但希望通过它可以显示出您的困惑所在。

可视化,将是这样的另一种方式:

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; 
+0

非常感谢。这正是我需要理解这一点的。 – user994602