我正在學習數據結構和算法。在遞歸函數中使用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