Изучаю структуры данных и алгоритмы.
При решении одной из проблем у меня возникло недопонимание/путаница с параметром 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 можно рассматривать как глобальную/статическую переменную
Может ли кто-нибудь помочь мне в правильном понимании этого.
Заранее спасибо.