【发布时间】:2017-03-19 21:16:39
【问题描述】:
我正在学习数据结构和算法。
在解决其中一个问题时,我对递归函数调用中的 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)。
那么,让我们考虑以下情况:-
函数被递归调用并到达链表的末尾。
因此,“Current”参数值为 5,“Pre”参数值为 4。
所以“if”案例将失败(因为它没有“next”数据)......所以它将来到else案例并分配“newRoot”参数(如5)
当前调用结束并进入上一个调用堆栈。
当 newRoot 参数不作为“out”参数传递时,当最后一次函数调用结束时(如上所述),newRoot 的当前值将丢失。
我的理解:-
1.当参数不是ref/out参数时,每次调用都会新建每个参数并入栈
2. 当它是一个 ref/out 参数时,无论调用的深度如何,都只创建/可用单个副本,并且将完全使用相同的副本。
3. 所以,这个 ref/out 参数可以被认为是一个全局/静态变量
谁能帮助我正确理解这一点。
提前致谢。
【问题讨论】:
-
(2) 不正确。 ref 引用另一个变量。它可以是任何变量,每个递归调用帧都可以接收不同的引用。
标签: c# recursion data-structures linked-list recursive-datastructures