【问题标题】:Recursive Function vs Sub with changing Argument - Why is one better具有更改参数的递归函数与子函数 - 为什么一个更好
【发布时间】:2013-01-08 14:28:07
【问题描述】:

昨天我向this question 询问了关于使用递归子函数的问题,其中传入的参数是实际所需的输出,并得到了建议,我宁愿创建一个递归函数,并将所需的输出作为返回值。

这两种解决方案如下所示(在本例中,获取树视图中某个节点下的所有选中节点,返回为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 更有效率吗?而且,如果是这样,是否有时会创建如上所示的递归子是内存管理的更好解决方案?还是从不??

谢谢!

【问题讨论】:

    标签: .net vb.net oop


    【解决方案1】:

    所以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
    

    【讨论】:

    • 感谢@Meta-Knight! - 那是定期建立的良好编程实践吗?我只是想了解“优秀程序员”在每种情况下会做什么,以便最好地模仿他们......
    • 就最佳实践而言,我无法真正发表评论,但我已经看过并使用了几次这种设置,它似乎运行高效且快速。
    • 这种类型的东西可能会在未来的开发中引起问题。至少,为 sub 命名不同。实际上,如果效率很重要,为了简单起见,我更喜欢单独使用 sub。
    • @xpda:只是为了调用代码的易用性和可读性,我更喜欢使用这两种方法(或者如果性能可以接受,就只使用一个 Function )。虽然你的命名是对的,但我会以不同的方式命名 Sub,因为 Get 前缀意味着应该返回一个值。
    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2016-02-04
    相关资源
    最近更新 更多