递归如何在这里工作?

时间:2011-11-07 04:26:47

标签: java recursion

递归对我来说是一种新的练习,我正在努力改进它并理解方法如何返回。我有以下程序,但我不知道如何使用this关键字。您能否查看代码并指导我完成程序执行时显示变量所持有的值的程序?

我已经尝试了很多东西来确定计算方法中的值如何在执行后如何保持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 = this.go(stuff, 0);
        System.out.println("The answer is " + answer);

    }
    private int go(int[] numbers, int spot) {
        if (numbers.length == spot) return spot;
        int value = this.go(numbers, spot + 1 ); 
        return value + numbers[spot];
    }

}

2 个答案:

答案 0 :(得分:0)

好的,我在这里注意了一些事情:

go()的目的似乎是计算数组中数字的总和。如果是这种情况,您的方法应如下所示:

private int go(int[] numbers, int spot) {
        if (numbers.length - 1 == spot) return numbers[spot];
        int value = this.go(numbers, spot + 1 ); 
        return value + numbers[spot];
    }

这是因为在这种情况下numbers.length将返回4,但此数组中的最后一个元素位于索引3(数组为0索引)。

这样,当第二个参数设置为3时调用该函数时,它将返回数组中最后一个元素的值,然后代码将“冒泡”(我喜欢称之为)并计算通过随后返回当前求和值+当前调用值来求元素之和。

关于this关键字的问题,实际上非常简单。 this始终引用您的代码所在的当前类实例。在这种情况下,您在main函数中创建一个名为Recurs1的{​​{1}}实例,以便每次调用该特定对象上的方法时,这些方法中使用的r关键字将引用this。如果您在程序中创建了多个r个对象(每个对象具有潜在的不同内部状态),则它们各自的Recurs1引用将始终指向自己,允许您访问其成员变量和方法。

希望有帮助和好运,递归通常是大多数人一开始很难解决的问题,但是一旦你习惯了它就会非常酷!

答案 1 :(得分:0)

好的,所以这不是你问题本身的答案,更像是递归课程。

请记住,我从未尝试过使用java类。

递归是指在达到答案之前重复调用自身的函数,或者您的函数检测到您的堆栈空间不足。

您首先进入该功能,确定您是否打电话给自己。

当你自己打电话时,你会将新的数据副本推送到堆栈并开始执行。我认为在java的情况下你会将一个新对象分配到(不要引用我),每次调用都会有一组新的变量获得新值。

当您越来越深入地进行递归时,您只需分配对象的新副本,直到找到答案或内存不足为止。

如果找到答案,则将结果返回到对象堆栈中的上一级,例如:

int foo(int i ){
  if(some condition){ 
   return foo(i);
  } else
   return i  
}

as你可以看到条件测试是否为真,foo()不断被调用。现在,在每次调用时,foo()的变量都会保存为尽可能多的级别。如果条件测试为false,则foo()的每个实例都返回到前一个,直到您处于foo()的原始调用,然后返回到foo()的调用者。

清楚如泥?