投稿者 shu  (社会人) 投稿日時 2021/3/2 13:59:38
魔界の仮面弁士さんの

Private Function 再帰(node As TreeNode) As TreeNode
    Return If(node?.Parent Is Nothing, node, 再帰(node.Parent))
End Function


を利用させてもらって

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim target As TreeNode = TreeView1.Nodes(0).Nodes(0).Nodes(0)
        Dim root1 As TreeNode = 再帰(target)
End Sub


コードの関数を展開すると

1段階目
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim target As TreeNode = TreeView1.Nodes(0).Nodes(0).Nodes(0).Nodes(0)
        Dim root1 As TreeNode = If(target?.Parent Is Nothing, target, 再帰(target.Parent))
End Sub


2段階目
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim target As TreeNode = TreeView1.Nodes(0).Nodes(0).Nodes(0).Nodes(0)
        Dim root1 As TreeNode = If(target?.Parent Is Nothing, target, 
                   If(target.Parent?.Parent Is Nothing, target.Parent, 再帰(target.Parent.Parent)))
End Sub


3段階目
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim target As TreeNode = TreeView1.Nodes(0).Nodes(0).Nodes(0).Nodes(0)
        Dim root1 As TreeNode = If(target?.Parent Is Nothing, target, 
                   If(target.Parent?.Parent Is Nothing, target.Parent,
                   If(target.Parent.Parent?.Parent Is Nothing, target.Parent.Paret, 再帰(target.Parent.Parent.Parent))))
End Sub

となりますがtarget.Parent.Parent?.Parent Is Nothing = nothing のため

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim target As TreeNode = TreeView1.Nodes(0).Nodes(0).Nodes(0).Nodes(0)
        Dim root1 As TreeNode = If(target?.Parent Is Nothing, target, 
                   If(target.Parent?.Parent Is Nothing, target.Parent,
                   target.Parent.Parent))
End Sub

となり
target.Parent?.ParentはNothingでない為
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim target As TreeNode = TreeView1.Nodes(0).Nodes(0).Nodes(0).Nodes(0)
        Dim root1 As TreeNode = If(target?.Parent Is Nothing, target, target.Parent.Parent))
End Sub

となり
target?.ParentはNothingでない為
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim target As TreeNode = TreeView1.Nodes(0).Nodes(0).Nodes(0).Nodes(0)
        Dim root1 As TreeNode = target.Parent.Parent
End Sub

となります。

階層が変わっても同じ様に考えることが出来ます。
再帰処理の動作はまず深く潜っていき戻ってきて結果が出るという動きになります。

今回のような関数内の最後の部分で再帰を行っているものはループ構造に変更が出来る為
ループ構造で実装した方が処理コストが減ります。