■25715 / ) |
Re[7]: 再帰によるスタックオーバフローエラー |
□投稿者/ Lily (6回)-(2008/09/24(Wed) 18:17:43)
|
■No25701 (長月葵 さん) に返信
> どういった形で再帰処理をしてますか?
> そのもののソースではなくてよいのでこんな感じと言うコードを示してもらえると答えやすいです。
最終的には、下記のような数字の組み合わせを表示する
プログラムを作成しています。(多い場合は、5千行以上)
-------------------------------------------------
1
1 - 2
1 - 2 - 3
1 - 2 - 3 - 4
1 - 2 - 3 - 5
1 - 3
1 - 3 - 4
2
-------------------------------------------------
大分省略しましたが、こんな感じです。
PubTreeTblというDataTableに値が格納されている
PubClaimBodyに結果を書込み(実際は、下記ソースにてDataTableに値を保存している。)
Private Sub MakeOutPut()
' ************************************************************************
' 機能: 出力用DataTable作成(PubSenteTreeTbl)
' ************************************************************************
For rowCnt As Integer = 0 To PubTreeTbl.Rows.Count - 1
' No取得
PubClaimNo = PubTreeTbl.Rows(rowCnt).Item("No")
If PubTreeTbl.Rows(rowCnt).Item("Flg") = True Then
' 最大桁数によって、左側にスペースを追加
PubClaimBody = PubTreeTbl.Rows(rowCnt).Item("No").ToString.PadLeft(MaxFigure)
Call ClaimReflexive(rowCnt)
End If
Next
End Sub
Private Sub ClaimReflexive(ByVal rowCnt As Integer)
' ************************************************************************
' 機能: 再帰処理
' ************************************************************************
Dim ClaimArray() As String = Split(PubTreeTbl.Rows(rowCnt).Item("List"), ",")
If ClaimArray.Length >= PubAryPos(rowCnt) Then
If ClaimArray(PubAryPos(rowCnt) - 1) <> "" Then
' クレームNo取得
PubSubClaimNo = Integer.Parse(ClaimArray(PubAryPos(rowCnt) - 1))
PubClaimBody += "-" & PubSubClaimNo.ToString.PadLeft(MaxFigure)
Else
' ツリーの値が取れなかった場合
If ClaimBeforeReflexive(rowCnt) = False Then
Exit Sub
End If
End If
Else
' ツリーの値が取れなかった場合
If ClaimBeforeReflexive(rowCnt) = False Then
Exit Sub
End If
End If
' 再帰
Call ClaimReflexive(PubSubClaimNo - 1)
End Sub
Private Function ClaimBeforeReflexive(ByVal rowCnt As Integer)
' クレームツリーの前の数値を取得
PubSubClaimNo = PubAryPla(rowCnt)
' 終了条件
If PubSubClaimNo = 0 Then
ClaimBeforeReflexive = False
Exit Function
End If
' ツリーの最後を削除
PubClaimBody = Regex.Replace(PubClaimBody, "-(?!.*-).*([0-90-9]*)", "")
ClaimBeforeReflexive = True
End Function
> 「大幅の改善が認められない」と言うのはループ処理に変更してもスタックオーバーフローは発生しそうと言うことですか?
> それとも何らかのパフォーマンスについての言及ですか?
すいません。こちらの都合です。
実は、テスト等が終っている状態で大きなプログラムの修正が認められないということです。
|
|