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參數可能會導致錯誤,因爲有人可能會在調用遞歸函數期間更改變量的值。