[英]Recursive Function vs Sub with changing Argument - Why is one better
昨天我問了一個關於使用遞歸子的問題,其中傳遞的參數是實際所需的輸出,並且給出了建議,而是使用所需的輸出作為返回值來生成遞歸函數。
這兩個解決方案如下所示(在此示例中,將樹視圖中某個節點下的所有已檢查節點作為List(Of Treenode)
:
遞歸子:
Sub GetAllCheckedNodes(ByVal tn As TreeNode, ByVal NodesList As List(Of TreeNode))
If tn.Checked Then NodesList.Add(tn)
For Each nd As TreeNode In tn.Nodes
GetAllCheckedNodes(nd, NodesList)
Next
End Sub
所需輸出將是NodesList
,因此使用如下:
Dim CheckedNodes as New List(Of Treenode)
GetAllCheckedNodes(MyTreeNode, CheckedNodes)
在哪個時間點,將填充Checkednodes
。
遞歸函數:
Function GetAllCheckedNodes(ByVal tn As TreeNode) As List(Of TreeNode)
Dim RetVal As New List(Of TreeNode)
If tn.Checked Then RetVal.Add(tn)
For Each nd In tn.Nodes
RetVal.AddRange(GetAllCheckedNodes(tv, nd))
Next
Return RetVal
End Function
將使用如下:
Dim CheckedNodes as List(Of Treenode) = GetAllCheckedNodes(MyTreeNode)
所以我的問題是:
List(Of TreeNode)
,而您在Sub中使用相同的列表...這不會使子內存更有效嗎? 並且,如果是這樣,有時候如上所示創建的遞歸子是一個更好的內存管理解決方案嗎? 或者從不? 謝謝!
因此函數對於調用代碼來說更簡單,並且Sub執行得更好。 這樣做可以讓兩全其美:
Function GetAllCheckedNodes(ByVal tn As TreeNode) As List(Of TreeNode)
Dim output As New List(of TreeNode)
GetAllCheckedNodes(tn, output)
Return output
End Function
Private Sub GetAllCheckedNodes(ByVal tn As TreeNode, ByVal NodesList As List(Of TreeNode))
If tn.Checked Then NodesList.Add(tn)
For Each nd As TreeNode In tn.Nodes
GetAllCheckedNodes(nd, NodesList)
Next
End Sub
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.