昨日、実際の目的の出力である引数を渡して再帰サブルーチンを使用することについてこの質問をしたところ、目的の出力が戻り値である再帰関数を作成するというアドバイスが与えられました。
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)
だから私の質問は:
- 明らかに、関数の方が理解しやすいように見えますが、プログラミングの観点からそれを使用する他の理由はありますか?
- 再帰関数では
List(Of TreeNode)
、サブで同じリストを使用しているのに対し、各反復で新しいを宣言しています...それにより、サブのメモリ効率が向上しませんか? もしそうなら、上記のように作成された再帰的なサブルーチンがメモリ管理のより良い解決策になることがありますか? それとも決して??
ありがとう!