投稿者 まこ  (社会人) 投稿日時 2021/2/14 12:21:27
VB2019、WindowsFormアプリケーションで現在、再帰処理について勉強しています。
お題として、「TreeNodeの親を辿って、RootNodeを得る」というのを、実験しています。

Treeviewの構成は以下で試しています。
「ノード3の親ノードのレベルが0じゃないなら、さらに、その親を調べる」というのを
再帰で書くには、どうすればいいでしょうか。最後はレベル0の「ノード0」を結果として得たいです。

ノード0
   |--ノード1
        |--ノード2
              |--ノード3


以下は自分でやってみたのですが、ループだと期待通り「ノード0」が得られますが、
再帰だと「ノード3」が返却されます。
デバッガで追いかけると
「ノード3」=>「ノード2」=>「ノード1」=>「ノード0」=>「ノード1」=>「ノード2」=>「ノード3」
と「ノード0」でReturnして欲しいのに、関数から抜けずに、逆戻りしてしまいます。

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        'ノード3 
        Dim target As TreeNode = TreeView1.Nodes(0).Nodes(0).Nodes(0).Nodes(0)
        '親を辿ってルートを得る 
        Dim root1 As TreeNode = 再帰(target) '再帰では× 
        Dim root2 As TreeNode = ループ(target) 'ループでは〇 
    End Sub

    Private Function 再帰(node As TreeNode) As TreeNode
        If node Is Nothing Then Return Nothing
        Dim temp As TreeNode = node
        If temp.Level > 0 Then
            再帰(temp.Parent)
        End If
        Return temp
    End Function

    Private Function ループ(node As TreeNode) As TreeNode
        If node Is Nothing Then Return Nothing
        Dim temp As TreeNode = node
        While temp.Level > 0
            temp = temp.Parent
        End While
        Return temp
    End Function