繁体   English   中英

递归在这里如何工作?

[英]How does recursion work here?

递归对我来说是一种新的实践,我正在尝试做得更好,并了解方法如何返回。 我有以下程序,但对如何使用this关键字不满意。 您能否查看一下代码,并逐步引导我完成显示方法执行时变量所包含的值的程序?

我已经尝试了很多方法来确定执行后,compute方法中的值答案如何保持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];
    }

}

好了,我在这里注意到以下几点:

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始终引用您代码所在的当前类实例。在这种情况下,您在主函数中创建一个名为rRecurs1实例,因此,每当对该特定对象调用方法时,这些方法中使用的this关键字将引用r 如果在程序中创建了多个Recurs1对象(每个Recurs1对象具有可能不同的内部状态),则它们各自的this引用将始终指向自身,从而允许您访问其成员变量和方法。

希望对您有所帮助,并祝您好运,通常大多数人一开始都会遇到递归问题,但是一旦习惯了,那就很酷了!

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

请记住,我从未尝试使用Java类来做到这一点。

递归表示函数重复调用自己,直到获得答案为止,或者函数检测到堆栈空间不足。

您首先要进入该函数,以确定是否可以自称。

当您自称时,您会将数据的新副本推入堆栈并开始执行。 认为在Java的情况下,您将在堆中分配一个新对象(对此不加引号),并且每次调用都将具有一组新的变量,这些变量将填充新的值。

随着递归的深入,您只需分配对象的新副本,直到找到答案或内存不足。

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

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

如您所见,如果条件测试为true,则foo()不断被调用。 现在,在每次调用时,foo()的变量都会保存到您可以访问的多个级别。 如果条件测试为false,则foo()的每个实例都会返回到前一个实例,直到您对foo()进行了原始调用,然后才将其返回给foo()的调用者。

像泥一样清除?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM