Использование Ref/Out в качестве параметров в рекурсивной функции

Изучаю структуры данных и алгоритмы.

При решении одной из проблем у меня возникло недопонимание/путаница с параметром out/ref в вызове рекурсивной функции.

Итак, я хочу уточнить, верно ли мое понимание.

Код:-

class Node
{
    public int data;
    public Node Next;
}

void reverse(Node pre, Node current, out Node newRoot)
{
    if (current.Next != null)
    {
        reverse(current, current.Next, out newRoot);
        current.Next = pre;
    }
    else
    {
        newRoot = current; // 5
        current.Next = pre;
    }
}

Node root1 = new Node()
{
    data = 1
};

Node root2 = new Node()
{
    data = 2
};

И т. д.

root1.Next = root2;
root2.Next = root3;

И т. д.

Место вызова: -

Node newRoot = null;
reverse(null, root1, out newRoot);

Ввод: 1->2->3->4->5

Выход: 5->4->3->2->1

Цель:-

Функция reverse рекурсивно перевернет один связанный список и вернет новый обновленный корневой указатель (который является newRoot).

Итак, давайте рассмотрим следующий случай: -

Функция рекурсивно вызывается и достигает конца связанного списка.

Таким образом, значение параметра «Текущий» будет равно 5, а значение параметра «Предварительный» будет равно 4.

так что случай "if" потерпит неудачу (поскольку для него нет "следующих" данных)... Так что он придет к случаю else и назначит параметр "newRoot" (как 5)

и текущий вызов завершается и переходит к предыдущему стеку вызовов.

Когда параметр newRoot не передается как параметр «out», при завершении последнего вызова функции (как описано выше) текущее значение newRoot будет потеряно.

Мое понимание:-
1. Когда параметр не является параметром ref/out, тогда для каждого вызова каждый параметр будет создаваться заново и помещаться в стек
2. Когда это параметр ref/out , то создается/доступна только одна копия независимо от глубины вызова, и она будет использоваться полностью.
3. Итак, этот параметр ref/out можно рассматривать как глобальную/статическую переменную

Может ли кто-нибудь помочь мне в правильном понимании этого.

Заранее спасибо.


person NANDAKUMAR    schedule 06.11.2016    source источник
comment
(2) неверно. ref ссылается на другую переменную. Это может быть любая переменная, и каждый кадр рекурсивного вызова может получить другую ссылку.   -  person usr    schedule 06.11.2016


Ответы (1)


Не совсем уверен в том, что вы пытаетесь понять, но между параметром out и статической переменной есть фундаментальное различие: контекст.

Статическая переменная доступна во всем контексте ее атрибута видимости: общедоступном, внутреннем защищенном или частном.

Переменная out доступна только в контексте вашей рекурсивной функции.

Другими словами, использование статической переменной вместо параметра out может привести к ошибке в вашем случае, потому что кто-то может изменить значение переменной во время вызова рекурсивной функции.

person Ouarzy    schedule 06.11.2016