递归函数vs Sub与更改参数 - 为什么一个更好

时间:2013-01-08 14:28:08

标签: .net vb.net oop

昨天我问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)

所以我的问题是:

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

1 个答案:

答案 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