簡體   English   中英

遞歸函數vs Sub與更改參數 - 為什么一個更好

[英]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)

所以我的問題是:

  1. 顯然,函數似乎更容易理解,但是從編程的角度來看還有其他任何理由使用它嗎?
  2. 在遞歸函數中,您在每次迭代時聲明一個新的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM