我正在学习数据结构和算法。在递归函数中使用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
目的: -
反转功能,将recursivly扭转单链表和返回新的更新的根指针(它是newRoot)。
所以,让我们考虑以下情况: -
的功能recursivly调用,达到了链接列表的末尾。
因此,“当前”的参数值是5,“预”参数值将是4
所以“如果”的情况下会失败(因为没有“下一个”数据的话)。 ..所以它会来到其他情况,并分配“newRoot”参数(如5)
并且当前通话结束并转到前一个通话堆栈。
当newRoot参数未作为“out”参数传递时,当最后一个函数调用结束时(如上所述),newRoot的当前值将丢失。
我的理解: -
1.当参数不是REF /输出参数,然后为每个呼叫,每一个参数将被新创建,并被推入堆栈
2.当它是一个参考输入/输出参数,那么无论通话的深度如何,只有单个副本被创建/可用,并且将完全使用相同的副本。
3.所以,这个参考/输出参数可以被认为是一个全局/静态变量
有人能帮助我,正确理解这一个。
在此先感谢。
(2)不正确。 ref引用另一个变量。它可以是任何变量,每个递归调用帧可以接收不同的参考。 – usr