在递归函数中使用Ref / Out作为参数

时间:2016-11-06 13:17:31

标签: c# recursion data-structures linked-list recursive-datastructures

我正在学习数据结构和算法。

在解决其中一个问题时,我对递归函数调用中的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参数可以被认为是全局/静态变量

有人可以帮助我正确理解这一点。

提前致谢。

1 个答案:

答案 0 :(得分:0)

不确定您尝试理解的内容,但out参数和静态变量之间存在根本区别:context。

静态变量在其可见性属性的整个上下文中可用:public,internal protected或private。

out变量仅在递归函数的上下文中可用。

换句话说,使用静态变量而不是out参数可能会导致错误,因为有人可能会在调用递归函数期间更改变量的值。