0

我正在学习数据结构和算法。在递归函数中使用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.所以,这个参考/输出参数可以被认为是一个全局/静态变量

有人能帮助我,正确理解这一个。

在此先感谢。

+0

(2)不正确。 ref引用另一个变量。它可以是任何变量,每个递归调用帧可以接收不同的参考。 – usr

回答

0

不太确定你试图理解什么,但out参数和静态变量之间存在根本的区别:context。

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

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

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