昨天我问this question关于使用一个递归的sub,其中传递的参数是实际所需的输出,并且给出了一个建议,即使用所需的输出作为返回值来生成递归函数。
这两个解决方案如下所示(在此示例中,将树视图中某个节点下的所有已检查节点作为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中使用相同的列表...这不会使子内存更有效吗?并且,如果是这样,有时候如上所示创建的递归子是一个更好的内存管理解决方案吗?或者永远不会?? 谢谢!
答案 0 :(得分:2)
因此函数对于调用代码来说更简单,并且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