【问题标题】:Using Ref/Out as parameters in recursive function在递归函数中使用 Ref/Out 作为参数
【发布时间】: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


【解决方案1】:

不太确定您试图理解什么,但输出参数和静态变量之间存在根本区别:上下文。

静态变量在其可见性属性的整个上下文中都可用:公共、内部保护或私有。

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

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

【讨论】:

    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 2010-10-08
    • 2023-03-31
    • 1970-01-01
    • 2011-05-29
    相关资源
    最近更新 更多