查询Recursion中此变量的用法

时间:2014-09-10 00:14:46

标签: java recursion

调用方法后,

node.nth(5)

在下面的代码中,

public class List_Node {
    int item;
    List_Node next;
    public List_Node() {
        this.item = 0;
        this.next = null;
    }
    public List_Node(int item, List_Node next) {
        this.item = item;
        this.next = next;
    }
    public List_Node(int item) {
        this(item, null);
    }
    public void insertAfter(int item) {
        this.next = new List_Node(item, this.next);
    }
    public List_Node nth(int position) {
        if (position == 1) {
            return this;
        } else if((position < 1) || (this.next == null)) {
        /* error checking */
            return null;
        } else {
            return this.next.nth(position - 1);
        }
    }
    public static void main(String[] args){
        List_Node node = new List_Node(0);
        List_Node temp = node;
        for (int item = 1; item < 5; item++) {
            temp.insertAfter(item);
            temp = temp.next;
        }
        System.out.println(node.nth(5).item);
    }
}

下面是我在4次递归调用后可以想象的nth()方法的堆栈帧。

enter image description here

我的问题:

根据上图,假设活动记录S5的实例值为pos1,我想了解一下,当java执行时会发生什么{ {1}}?
java是否将return thisthis的值指定为S5this的值?因为S4方法的else{}块中没有赋值语句(如此)。

注意:请忽略Java编码风格,因为我是新学员。

1 个答案:

答案 0 :(得分:8)

每次调用this.next.nth()时,都会在完全不同的对象上调用nth()方法。您的this将引用该新对象(在之前的堆栈中为next)。它不是一个纯粹的递归。试想一下,如果你在某个不同的对象上调用不同的方法。

因此position=1this会引用S5

<强>更新 让我们说你的List_Nodes是这样链接的 10→20→; 30-&GT; 40-→50

每当你从main打电话给node.nth(5)时,

Stack 1: position 5, this points to 10 (you are calling this.next.nth(4); means 20.nth())
    Stack 2: position 4, this points to 20 (calling this.next.nth(3); = 30.nth())
        Stack 3: position 3, this points to 30 (calling this.next.nth(2) = 40.nth())
            Stack 4: position 2, this points to 40 (calling this.next.nth(1) = 50.nth())
                Stack 5: position 1, this points to 50 (returning this; this here is 50)
                returns 50
            returns 50 (not going back into if, so return value remains same)
        returns 50
    returns 50
returns 50

在讨论聊天时,在图片中描述了同样的情况。在此处添加,以便将来的读者受益。 enter image description here

另一个更新

No assignment variable in else as such

你可以写这个像

List_Node temp = this.next.nth(position-1);
return temp;

一般情况下,我们需要将ListNode类分开,List应该有head,而Node会有item }和next指针。就像java中的LinkedList一样。然后,nth()方法将位于List类中,它只会迭代它直到您到达nth元素。