我正在学习数据结构和算法。
在解决其中一个问题时,我对递归函数调用中的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);
InPut:1-> 2-> 3-> 4-> 5
OutPut:5-> 4-> 3-> 2-> 1
目的: -
反向函数将递归反转单个链表并返回新更新的根指针(即newRoot)。
所以,让我们考虑以下情况: -
该函数被递归调用并到达链表的末尾。
因此,“当前”参数值为5,“前”参数值为4。
所以“if”的情况会失败(因为它没有“下一个”数据)...所以它会转到else情况并指定“newRoot”参数(如5)
并且当前通话结束并转到上一个通话栈。
当newRoot参数未作为“out”参数传递时,当最后一个函数调用结束时(如上所述),newRoot的当前值将丢失。
我的理解: -
1.当参数不是ref / out参数时,则对于每个调用,将新创建每个参数并将其推入堆栈
2.当它是ref / out参数时,无论呼叫的深度如何,都只创建/可用单个副本,并且将完全使用相同的副本。
因此,这个ref / out参数可以被认为是全局/静态变量
有人可以帮助我正确理解这一点。
提前致谢。
答案 0 :(得分:0)
不确定您尝试理解的内容,但out参数和静态变量之间存在根本区别:context。
静态变量在其可见性属性的整个上下文中可用:public,internal protected或private。
out变量仅在递归函数的上下文中可用。
换句话说,使用静态变量而不是out参数可能会导致错误,因为有人可能会在调用递归函数期间更改变量的值。