0

昨天我问了这个问题,关于使用递归子函数,传入的参数是实际所需的输出,并得到建议,而不是使用所需的输出作为返回值的递归函数。

这两个解决方案如下所示(在此示例中,要获取树视图中某个节点下的所有已检查节点,返回为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)

所以我的问题是:

  1. 显然,该功能似乎更容易理解,但从编程的角度来看,还有其他理由使用它吗?
  2. 在递归函数中,您在List(Of TreeNode)每次迭代中声明一个新的,而您在 Sub 中使用相同的列表...这不会使 sub 更有效地使用内存吗?并且,如果是这样,是否有时会创建如上所示的递归子代码是更好的内存管理解决方案?还是从来没有??

谢谢!

4

1 回答 1

2

所以 Function 对于调用代码来说更简单,而 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
于 2013-01-08T14:53:00.850 回答