0

昨日、実際の目的の出力である引数を渡して再帰サブルーチンを使用することについてこの質問をしたところ、目的の出力が戻り値である再帰関数を作成するというアドバイスが与えられました。

2 つのソリューションは次のようになります (この例では、次のように返されるツリービュー内の特定のノードの下にあるすべてのチェックされたノードを取得します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)、サブで同じリストを使用しているのに対し、各反復で新しいを宣言しています...それにより、サブのメモリ効率が向上しませんか? もしそうなら、上記のように作成された再帰的なサブルーチンがメモリ管理のより良い解決策になることがありますか? それとも決して??

ありがとう!

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 に答える