DOBON.NET DOBON.NETプログラミング掲示板過去ログ

再帰処理を途中で抜けるには?

環境/言語:[VB.NET XP NET Framework1.1]
分類:[.NET]

いつもお世話になっております。

現在ツリーの検索を行おうとしています。
数あるサンプルの中から「ツリーの全内容を列挙する」などを参考に作成しようとしているのですが
再帰処理にてうまくいかず困っております。検索ワードと前方一致するツリーのフォルダを発見後
ノードを返しているのですが、返したあとも再帰処理が走り結局ツリーの全フォルダを検索してしまいます。
また再度処理が走るために結局検索できないでいます。
検索成功後は処理を抜けノードを返したいのですが、途中で再帰処理を抜けるにはどのようにすればよろしいのでしょうか?
Private変数にて対応するしかないのでしょうか?

下記の様なソースになっております。

'ツリービューより子ノードの検索(呼び出し元ボタン)
trvItem.SelectedNode = FindNode(trvItem.Nodes, key)
trvItem.Select()

Public Function FindNode(ByVal nodes As TreeNodeCollection, ByVal key As String) As TreeNode

Dim node As TreeNode

For Each node In nodes

'前方一致検索
If Trim(node.Text).StartsWith(key) Then

return node

Else

'再起処理にて検索
FindNode(node.Nodes, key)

End If

Next

Return nothing

End Function
VBはあまり詳しくないですが、

> '再起処理にて検索
> FindNode(node.Nodes, key)

再帰処理の流れに入った場合の終了処理が無いからだと思います
このままだと再帰処理からの戻り値が何も使用されていないので
そのままforeachが進んでいってしまいます

return FindNode(node.Nodes, key)

ではどうでしょう?
■No15178に返信(bellさんの記事)
> VBはあまり詳しくないですが、
>
>> '再起処理にて検索
>> FindNode(node.Nodes, key)
>
> 再帰処理の流れに入った場合の終了処理が無いからだと思います
> このままだと再帰処理からの戻り値が何も使用されていないので
> そのままforeachが進んでいってしまいます
>
> return FindNode(node.Nodes, key)
>
> ではどうでしょう?

たぶん、最初のノードを配列で受け取り
その数分まわしているので
1つ目のノードに探しているものがあれば return書いて構わないと思いますが、
なかった場合、Nothingが帰ってくるので
FindNodeの戻り値がNothingでない場合、returnするとしたほうがいいかと思います。
引用されたソースでは、関数プロシージャを単独で呼び出している行があり、
再帰処理が完成していないように思います。

下記のソースで可能です。
(関数、変数の意味をわかりやすくするため、一部変更しています。)

(呼び出し元ボタン)
trvItem.SelectedNode = GetNode(trvItem.Nodes, key)
trvItem.Select()

Public Function GetNode(ByVal nodes As TreeNodeCollection, ByVal key As String) As TreeNode
Dim node As TreeNode
Dim FindNode As TreeNode
For Each node In nodes
If Trim(node.Text).StartsWith(key) Then
Return node
Else
FindNode = getNode(node.Nodes, key)
If Not FindNode = Nothing Then
Return FindNode
End If
End If
Next
Return Nothing
End Function
解決済み!
皆様、ご回答ありがとう御座いました。

初めて再帰処理をコーディングしたのですが、
終了処理がなかったとはお恥ずかしい限りです。
もっと勉強します(汗
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板