Подтвердить что ты не робот

Запрос об использовании этой переменной в 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);
    }
}

Ниже представлен кадр стека, который я могу представить для метода nth() после 4 рекурсивных вызовов.

enter image description here

Мой вопрос:

В соответствии с приведенной выше диаграммой. Предполагая, что экземпляр записи активации S5 со значением pos как 1, я хотел бы понять, что происходит, когда java выполняет return this?
Соответствует ли java значение this в S5 как значение this в S4? Поскольку в else{} блоке метода nth() отсутствует оператор присваивания (как таковой).

Примечание. Пожалуйста, игнорируйте стиль кодирования Java, как новый ученик.

4b9b3361

Ответ 1

Каждый раз, когда вы вызываете this.next.nth(), вы вызываете метод nth() на совершенно другом объекте. Ваш this будет ссылаться на этот новый объект (в предыдущем стеке это было next). Это не чистая рекурсия. Просто подумайте, как будто вы вызываете другой метод на какой-то другой объект.

Итак, когда position=1 this будет ссылаться на S5.

UPDATE Допустим, что ваши List_Nodes соединены цепями 10- > 20- > 30- > 40- > 50

Всякий раз, когда вы вызываете 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

Другое UPDATE

No assignment variable in else as such

Вы можете написать это как

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

В общем, нам нужно отделить классы List и Node, ваш List должен иметь head, а ваш Node будет иметь указатель item и next. Также как LinkedList в java. Тогда метод nth() будет в классе List, и он просто выполняет его повторение до тех пор, пока вы не достигнете элемента nth.