C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 47 を表示中)
■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



> 「大幅の改善が認められない」と言うのはループ処理に変更してもスタックオーバーフローは発生しそうと言うことですか?
>  それとも何らかのパフォーマンスについての言及ですか?
すいません。こちらの都合です。
実は、テスト等が終っている状態で大きなプログラムの修正が認められないということです。



返信 編集キー/


管理者用

- Child Tree -