0

私のコードは以下の通りです:

public int workTimeSum(list of parameter){

    int i=0,sum=0,flag=-1;
    boolean b=true;
    Stack<NonOverlapIntervals> str;

    if(st.size()!=1){
        b=recursiveCheck(non_overlap_list,st,Ioj);

        if(b==false){
            st.pop();
        }

        System.out.println("now size is:"+st.size());
    }

    str=(Stack<NonOverlapIntervals>) st.clone();
    System.out.println("Stack is ss");
    while(!str.empty()){
        System.out.println(str.pop().self_id);
    }

    if(b || st.size()==1){
        for(NonOverlapIntervals obj:non_overlap_list){
            i++;

            if(obj.id==ids){

                if(st.size()!=1 && object_Present(st,obj)){

                    continue;
                }
                else{
                    st.push(obj);
                    sum=workTimeSum(non_overlap_list,obj,st,obj.self_id,i);

                    if(sum_max<sum)
                        sum_max=sum;
                }
            }
        }
        flag=1;
    }
    else{
        return 0;
    }

上記は再帰コードです。

上記のコードで確認する必要があるのはsumsum_max変数のみです。

sum_max合計を計算し、合計が計算されるたびにそれが大きいかどうかを確認しています。

しかし、sum_max各呼び出しの後にゼロに初期化したので、 sum_max0 になります。

sum_maxグローバル変数として宣言すると、問題は解消されます。しかし、グローバル変数の使用は許可されていません。

また、再帰関数のパラメーターを渡そうとしsum_maxましたが、うまくいきません。

4

2 に答える 2

1

変数がnullかどうかを確認し、初期化して次のメソッドに渡すだけであれば、2番目のメソッドを必要とせずに変数を初期化できます(初期化されます)

//very basic endless example
public void myRecursiveMethod(Object var){

    if (var==null){
      var = new Object();
    }

    myRecusivemethod(var);
}
于 2013-10-13T13:27:18.000 に答える
0

答えはあなたが質問を表現した方法にあると思います。あなたは誤解しています:再帰に変数を初期化しません。一度だけ初期化します。

これを行うには、初期化を行う再帰の最初のステップ (「基本ケース」) 用に別のメソッドを作成すると役立つ場合があります。

ただし、投稿したコードは、実際には、あなたが説明したものと一致しません。投稿したコードでは、 sum_max をまったく初期化していません。だから私は混乱しています。

于 2013-10-13T13:10:18.353 に答える